使用数组构造函数时的NumPy MemoryError

时间:2016-09-17 19:19:28

标签: python arrays list numpy constructor

我正在使用numpy和list构造函数创建一些数组,我无法弄清楚为什么这会失败。我的代码是:

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的列表,其中包含int。

1 个答案:

答案 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])