我想創建一個數組的二維numpy數組,每行上有不同數量的元素。如何製作具有不同行大小的多維numpy數組?
試圖
cells = numpy.array([[0,1,2,3], [2,3,4]])
給出錯誤
ValueError: setting an array element with a sequence.
我想創建一個數組的二維numpy數組,每行上有不同數量的元素。如何製作具有不同行大小的多維numpy數組?
試圖
cells = numpy.array([[0,1,2,3], [2,3,4]])
給出錯誤
ValueError: setting an array element with a sequence.
雖然numpy的知道任意對象的陣列,它爲具有固定尺寸的數字均勻陣列優化。如果你真的需要數組的數組,最好使用嵌套列表。但根據數據的預期用途,不同的數據結構可能會更好,例如,如果您有一些無效的數據點,則會顯示一個蒙版數組。
如果你真的想靈活numpy的陣列,使用這樣的:
numpy.array([[0,1,2,3], [2,3,4]], dtype=object)
然而,這將創建一個一維數組存儲到列表的引用,這意味着你將失去大部分的好處Numpy(矢量處理,位置,切片等)。
這在Numpy中沒有得到很好的支持(根據定義,幾乎在任何地方,「二維數組」都具有相同長度的所有行)。 numpy的陣列的Python列表可能是你一個很好的解決方案,因爲這樣你會得到你可以用它們numpy的優勢:
cells = [numpy.array(a) for a in [[0,1,2,3], [2,3,4]]]
我們現在的問題被問了近7年後,和你的代碼
cells = numpy.array([[0,1,2,3], [2,3,4]])
在numpy的1.12.0,蟒蛇3.5執行,不會產生任何錯誤和 cells
包含:
array([[0, 1, 2, 3], [2, 3, 4]], dtype=object)
您訪問cells
元素爲cells[0][2] # (=2)
。
,如果你想建立的飛行作爲新的元素(即數組)您numpy的數組列表tom10的解決方案的另一種可用方法是使用append
:
d = [] # initialize an empty list
a = np.arange(3) # array([0, 1, 2])
d.append(a) # [array([0, 1, 2])]
b = np.arange(3,-1,-1) #array([3, 2, 1, 0])
d.append(b) #[array([0, 1, 2]), array([3, 2, 1, 0])]
另一種選擇是將存儲您的數組作爲一個連續的數組並存儲它們的大小或偏移量。這需要更多關於如何操作數組的概念性思考,但是可以使大量的操作工作,就好像您有一個具有不同大小的二維數組。在他們不能的情況下,可以使用np.split
來創建calocedrus建議的列表。最簡單的操作是ufuncs,因爲它們幾乎不需要修改。這裏有一些例子:
cells_flat = numpy.array([0, 1, 2, 3, 2, 3, 4])
# One of these is required, it's pretty easy to convert between them,
# but having both makes the examples easy
cell_lengths = numpy.array([4, 3])
cell_starts = numpy.insert(cell_lengths[:-1].cumsum(), 0, 0)
cell_lengths2 = numpy.diff(numpy.append(cell_starts, cells_flat.size))
assert np.all(cell_lengths == cell_lengths2)
# Copy prevents shared memory
cells = numpy.split(cells_flat.copy(), cell_starts[1:])
# [array([0, 1, 2, 3]), array([2, 3, 4])]
numpy.array([x.sum() for x in cells])
# array([6, 9])
numpy.add.reduceat(cells_flat, cell_starts)
# array([6, 9])
[a + v for a, v in zip(cells, [1, 3])]
# [array([1, 2, 3, 4]), array([5, 6, 7])]
cells_flat + numpy.repeat([1, 3], cell_lengths)
# array([1, 2, 3, 4, 5, 6, 7])
[a.astype(float)/a.sum() for a in cells]
# [array([ 0. , 0.16666667, 0.33333333, 0.5 ]),
# array([ 0.22222222, 0.33333333, 0.44444444])]
cells_flat.astype(float)/np.add.reduceat(cells_flat, cell_starts).repeat(cell_lengths)
# array([ 0. , 0.16666667, 0.33333333, 0.5 , 0.22222222,
# 0.33333333, 0.44444444])
def complex_modify(array):
"""Some complicated function that modifies array
pretend this is more complex than it is"""
array *= 3
for arr in cells:
complex_modify(arr)
cells
# [array([0, 3, 6, 9]), array([ 6, 9, 12])]
for arr in numpy.split(cells_flat, cell_starts[1:]):
complex_modify(arr)
cells_flat
# array([ 0, 3, 6, 9, 6, 9, 12])
問題是,你仍然不能使用d.mean(),d.flatten()等 – episodeyang 2017-12-05 06:04:28