从元组列表构建numpy数组



我想将元组列表转换为numpy数组。例如:

items = [(1, 2), (3, 4)]

使用np.asarray(items)我得到:

array([[1, 2],
[3, 4]])

但如果我尝试单独附加项目:

new_array = np.empty(0)
for item in items:
new_array = np.append(new_array, item)

CCD_ 2失去原来的形状并变成:

array([1., 2., 3., 4.])

我可以用new_array.reshape(2, 2):把它做成我想要的形状

array([[1., 2.],
[3., 4.]])

但如果不整形,我怎么能得到那样的形状呢?

首先,您需要为数组提供正确的形状,以便numpy能够理解如何解释提供给append方法的值。

然后,为了防止自动变平,指定要附加的轴。

此代码执行您想要执行的操作:

import numpy as np
items = [(1,2),(3,4)]
new_array = np.ndarray((0,2))
for item in items:
new_array = np.append(new_array, [item], axis=0)
print(new_array) # [[1. 2.]
#  [3. 4.]]

如果你有一个元组列表,并且出于某种原因,你决定讨厌标准数组构造函数(np.arraynp.asarray等,正如@JohnZwinck所指出的,这可能是最好的答案(,那么最有效的方法是预分配整个数组,然后分配给它:

items = [(1, 2), (3, 4)]
arr = np.empty((len(items), len(items[0])))
arr[...] = items

即使您想要的是随着时间的推移逐行扩展数组,但通过详细的计时已经表明,您通常最好只分配一个全新的数组,然后复制旧值。

因此,给定上述arr,通过这种方法,添加行的最有效方法是:

newitem = (5, 6)
oldarr = arr
arr = np.empty((oldarr.shape[0] + 1, *oldarr.shape[1:]))
arr[:-1,:] = oldarr
arr[-1,:] = newitem

最新更新