猿问

从元组列表构建 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)

在new_array失去原来的形状,并成为:


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

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


array([[1., 2.],

       [3., 4.]])

但是我如何在不重塑的情况下获得这种形状?


德玛西亚99
浏览 202回答 2
2回答

慕容708150

首先,您需要为数组提供正确的形状,以便numpy了解如何解释提供给append方法的值。然后,为防止自动展平,请指定要附加的轴。此代码执行您打算执行的操作:import numpy as npitems = [(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.]]

精慕HU

如果您有一个元组列表,并且出于某种原因决定讨厌标准数组构造函数(np.array,np.asarray等,正如@JohnZwinck 指出的那样可能是最好的答案),最有效的方法是预先分配整个数组,然后分配给它:items = [(1, 2), (3, 4)]arr = np.empty((len(items), len(items[0])))arr[...] = items即使你想要的是随着时间的推移增长的数组,一行接一行,它已被证明通过详细的时机,你通常最好是关闭只是分配一个全新的数组,然后复制了旧值。因此,鉴于上述情况arr,通过这种方法追加一行的最有效方法是:newitem = (5, 6)oldarr = arrarr = np.empty((oldarr.shape[0] + 1, *oldarr.shape[1:]))arr[:-1,:] = oldarrarr[-1,:] = newitem
随时随地看视频慕课网APP

相关分类

Python
我要回答