2016-09-17 77 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

相關問題