首页 > 解决方案 > 如何附加不同大小的numpy数组并将na放在空位置

问题描述

我想在一个 numpy 二维数组中添加一个新行,假设数组 1 的维度为 (2, 5) 并且数组 2 是一种形状为 (3,) 的行(具有 3 个值或列)我结果数组应该看起来像 (3, 10) 并且第三行中的最后两个索引应该是 NA。

arr1 = array([[9, 4, 2, 6, 7],
              [8, 5, 4, 1, 3]])

arr2 = array([3, 1, 5])

after some join or concat operation

arr1_arr2 = array([[9, 4, 2, 6, 7],
                   [8, 5, 4, 1, 3], 
                   [3, 1, 5, np.nan, np.nan]])

我已经尝试过 numpy append concat 函数,但它们不能以这种方式工作。

标签: python-3.xnumpy

解决方案


您只能连接相同维数的数组(这可以通过广播解决)和相同数量的元素,但连接轴除外。

因此,您需要附加/连接一个正确形状的空数组,然后用 的值填充它arr2

# concatenate an array of the correct shape filled with np.nan
arr1_arr2 = np.concatenate((arr1, np.full((1, arr1.shape[1]), np.nan)))
# fill concatenated row with values from arr2
arr1_arr2[-1, :3] = arr2

但总的来说,它总是很好的建议,不要附加/连接等数组。如果可以的话,尽量提前猜出最终数组的正确形状,并创建一个最终形状的空数组(或者用np.nan填充),在这个过程中会被填充。例如:

arr1_arr2 = np.full((3, 5), np.nan)
arr1_arr2[:-1, :] = arr1
arr1_arr2[-1, :arr2.shape[0]] = arr2

如果只是一个附加/连接操作并且对性能不是很重要,那么连接/附加是可以的,否则最好提前进行完整的预分配。

如果要连接许多数组并且要连接的所有数组具有相同的形状,这将是最好的方法:

arr1 = np.array([[9, 4, 2, 6, 7],
                 [8, 5, 4, 1, 3]])
# some arrays to concatenate:
arr2 = np.array([3, 1, 5])
arr3 = np.array([5, 7, 9])
arr4 = np.array([54, 1, 99])
# make array of all arrays to concatenate:
arrs_to_concat = np.vstack((arr2, arr3, arr4))
# preallocate result array filled with nan
arr1_arr2 = np.full((arr1.shape[0] + arrs_to_concat.shape[0], 5), np.nan)
# fill with values:
arr1_arr2[:arr1.shape[0], :] = arr1
arr1_arr2[arr1.shape[0]:, :arrs_to_concat.shape[1]] = arrs_to_concat

就性能而言,大型数组np.empty用于预分配最终数组并仅用np.nan.


推荐阅读