- Python 版本:3.7.11
- numpy 版本:1.21.2
我想要一個 numpy 陣列,如下所示:
[
["Hi", "Anne"],
["How", "are", "you"],
["fine"]
]
但是創建這個numpy陣列的程序并不簡單,如下:
# code block 1一開始我們有一個空的 numpy 陣列。第一個回圈:
# code block 2在第一個回圈中添加行或在這個回圈中,我們知道我們需要一個新行。
第一個回圈內部的回圈:
# code block 3該行的元素將被添加到這個內部回圈中。
假使,假設:
沒有指定迭代次數,我的意思是:
每行的列數不同,并且
我們不知道要添加到 numpy 陣列的行數。
也許下面的代碼示例將幫助我理解我的觀點:
a = [["Hi", "Anne"], ["How", "are", "you"], ["fine"]]
# code block 1: code for creating empty numpy array
for row in a:
# code block 2: code for creating empty row
for element in row:
# code block 3: code for appending element to that row or last row
問題:
是否可以通過這些步驟 (
code block #1, #2, #3)創建一個 numpy 陣列?如果是,如何?
uj5u.com熱心網友回復:
Numpy 陣列沒有針對不一致的維度進行優化,因此不是好的做法。您只能通過使元素物件而不是字串來做到這一點。但就像我說的,numpy 不是解決這個問題的方法。
a = numpy.array([["Hi", "Anne"], ["How", "are", "you"], ["fine"]], dtype=object)
uj5u.com熱心網友回復:
從嵌套串列開始:
In [99]: alist = [
...: ["Hi", "Anne"],
...: ["How", "are", "you"],
...: ["fine"]
...: ]
In [100]: alist
Out[100]: [['Hi', 'Anne'], ['How', 'are', 'you'], ['fine']]
從中創建一個陣列:
In [101]: arr = np.array(alist)
<ipython-input-101-3fd8e9bd05a9>:1: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
arr = np.array(alist)
In [102]: arr
Out[102]:
array([list(['Hi', 'Anne']), list(['How', 'are', 'you']), list(['fine'])],
dtype=object)
該警告告訴我們,我們正在做一些不尋常的事情,或者至少是次優的。我們可以用 抑制警告dtype=object,但結果是一樣的。
看看結果 - 它是一個 3 元素陣列,其中每個元素都是一個串列。它不是一個多維陣列。我們可以制作一個陣列陣列
In [103]: arr1 = np.array([np.array(el) for el in arr], object)
In [104]: arr1
Out[104]:
array([array(['Hi', 'Anne'], dtype='<U4'),
array(['How', 'are', 'you'], dtype='<U3'),
array(['fine'], dtype='<U4')], dtype=object)
聽起來你想用陣列復制這個串列建構式:
在 [107] 中:al = []
...: for row in alist:
...: al1 = []
...: for el in row:
...: al1.append(el)
...: al.append(al1)
...:
In [108]: al
Out[108]: [['Hi', 'Anne'], ['How', 'are', 'you'], ['fine']]
但是有幾個問題。
沒有簡單的“空”陣列;陣列可以具有 (0,) 或 (0,3) 或 (3,0,3) 等形狀。
陣列沒有簡單和快速的append. np.append不符合條件。任何“增長”陣列的嘗試都會導致創建一個具有完整副本的新陣列。List append 只是添加一個指向旨在增長的物件的指標。
雖然numpy可以創建字串 dtype 陣列(如 [104] 中所示),但它沒有特殊的字串處理代碼。您仍然必須使用 python 字串方法來操作這些字串。
物件 dtype 陣列上的數學是命中注定的,并且比數字陣列上的數學慢。本質上,它以串列理解速度發生。
numpy專為多維陣列的快速數值計算而設計。想想矩陣乘法、加法之類的事情。即使用作機器學習的墊腳石,陣列也需要是數字和“矩形”。不規則串列不能用于 ML。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/388990.html
