2016-09-17 84 views
0

我使用numpy和列表构造函数创建了几个数组,我无法弄清楚为什么这是失败的。我的代码是:当使用数组构造函数时NumPy MemoryError

import numpy as np 
A = np.ndarray([i for i in range(10)]) # works fine 
B = np.ndarray([i**2 for i in range(10)]) # fails, with MemoryError 

我也尝试了B = [i**2 for i in range(10)]其作品,但我需要它是一个ndarray。我不明白为什么普通的构造函数会工作,但调用函数不会。据我了解,ndarray构造函数甚至不应该看到它的内部,它应该得到一个长度为10的列表,其中包含ints。

+1

使用'np.array([...])''。 'np.ndarray'是一个具有不同参数的高级构造函数。 'np.array'是我们通常使用的。 – hpaulj

+0

如果尝试使用维度列表创建数组,请使用'np.zeros'(或'ones'或'empty')。 – hpaulj

+0

正如@hpaulj所说,通常你应该使用'np.array()'从列表中创建一个新的数组。 “ndarray”的第一个参数是数组的*形状*,而不是放入数组中的数据。所以你要求一个形状为'[0,1,4,9,16,25,36,49,64,81]'的数组。有趣的是它产生了一个'MemoryError'。在那里0,数组的总大小实际上是0. –

回答

2

http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.html是我们通常不使用的低级方法。它的第一个参数是shape

In [98]: np.ndarray([x for x in range(3)]) 
Out[98]: array([], shape=(0, 1, 2), dtype=float64) 
In [99]: np.ndarray([x**2 for x in range(3)]) 
Out[99]: array([], shape=(0, 1, 4), dtype=float64) 

正常使用zerosones构建一个给定形状的空白数组:

In [100]: np.zeros([x**2 for x in range(3)]) 
Out[100]: array([], shape=(0, 1, 4), dtype=float64) 

使用np.array如果你想打开一个列表到一个数组:

In [101]: np.array([x for x in range(3)]) 
Out[101]: array([0, 1, 2]) 
In [102]: np.array([x**2 for x in range(3)]) 
Out[102]: array([0, 1, 4]) 

你可以生成范围数字,然后对整个数组执行数学运算(不需要迭代):

In [103]: np.arange(3)**2 
Out[103]: array([0, 1, 4]) 
+0

谢谢!我想我知道这个类型是ndarray,所以我认为它是构造函数。 – user5563109

相关问题