理想情況下,你應該在交互式會話中測試這類代碼,您可以輕鬆獲取有關步驟的更多信息。我將在ipython
中舉例說明。
In [1]: result = np.empty
In [2]: result
Out[2]: <function numpy.core.multiarray.empty>
這是一個函數,而不是一個數組。正確的使用是result = np.empty((3,))
。那就是你必須調用具有所需大小參數的函數。
In [3]: np.append(result, [1,2,3])
Out[3]: array([<built-in function empty>, 1, 2, 3], dtype=object)
append
創建了一個數組,但看看內容 - 函數和3個數字。和dtype
。還有np.append
會返回結果。它不適用。
In [4]: result.item((1,2))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-4-51f2b4be4f43> in <module>()
----> 1 result.item((1,2))
AttributeError: 'builtin_function_or_method' object has no attribute 'item'
您的錯誤告訴我們result
是一個函數,而不是一個數組。你在開始時設定的是同樣的事情。
In [5]: np.shape(result)
Out[5]:()
In [6]: np.array(result)
Out[6]: array(<built-in function empty>, dtype=object)
在這種情況下np.shape
和np.size
功能版本不診斷,因爲它們先轉換成result
陣列。 result.shape
會發生錯誤。
根本的問題是,您使用的是列表模型
result = []
result.append([1,2,3])
result.append([4,5,6])
但陣列append
被錯誤命名,並濫用。這只是np.concatenate
的前端。如果你不明白concatenate
,你可能不會使用np.append
的權利。事實上,我認爲你根本不應該使用np.append
。
使用追加正確的方法是使用具有大小爲0維數組開始,並重復使用結果:
In [7]: result = np.empty((0,3),int)
In [8]: result
Out[8]: array([], shape=(0, 3), dtype=int32)
In [9]: result = np.append(result,[1,2,3])
In [10]: result
Out[10]: array([1, 2, 3])
In [11]: result = np.append(result,[4,5,6])
In [12]: result
Out[12]: array([1, 2, 3, 4, 5, 6])
但也許不是你想要的?即使我誤用了append
。
回到繪圖板:
In [15]: result = []
In [16]: result.append([1,2,3])
In [17]: result.append([4,5,6])
In [18]: result
Out[18]: [[1, 2, 3], [4, 5, 6]]
In [19]: result = np.array(result)
In [20]: result
Out[20]:
array([[1, 2, 3],
[4, 5, 6]])
有了一個真正的數組,你item
表達的作品,雖然平時我們使用[]
索引:
In [21]: result[1,2]
Out[21]: 6
In [22]: result.item((1,2))
Out[22]: 6
爲np.append
源代碼(注意使用np.concatenate
):
In [23]: np.source(np.append)
In file: /usr/local/lib/python3.5/dist-packages/numpy/lib/function_base.py
def append(arr, values, axis=None):
"""
...
"""
arr = asanyarray(arr)
if axis is None:
if arr.ndim != 1:
arr = arr.ravel()
values = ravel(values)
axis = arr.ndim-1
return concatenate((arr, values), axis=axis)