从形状为ndarray的ndarray中获取特定元素(n,)

时间:2016-04-28 02:17:16

标签: numpy multidimensional-array indexing

鉴于ndarray:

A = np.array([np.array([1], dtype='f'), 
              np.array([2, 3], dtype='f'), 
              np.array([4, 5], dtype='f'),
              np.array([6], dtype='f'), 
              np.array([7, 8, 9], dtype='f')])

显示为:

A
array([array([ 1.], dtype=float32), array([ 2.,  3.], dtype=float32),
   array([ 4.,  5.], dtype=float32), array([ 6.], dtype=float32),
   array([ 7.,  8.,  9.], dtype=float32)], dtype=object)

我正在尝试从每个"子阵列的第一个元素创建一个新数组" A.为了向您展示我的意思,下面是一些使用循环创建我想要的数组的代码。我希望尽可能高效地实现同样的目标,因为我的数组A非常大(约50000个条目),我需要多次进行操作。

B = np.zeros(len(A))
for i, val in enumerate(A):
    B[i] = val[0]
B
array([ 1.,  2.,  4.,  6.,  7.])

2 个答案:

答案 0 :(得分:0)

我建议将原始锯齿状阵列数组转换为单个蒙版数组:

B = np.ma.masked_all((len(A), max(map(len, A))))

for ii, row in enumerate(A):
    B[ii,:len(row)] = row

现在你有:

[[1.0 -- --]
 [2.0 3.0 --]
 [4.0 5.0 --]
 [6.0 -- --]
 [7.0 8.0 9.0]]

你可以这样得到第一列:

B[:,0].data

答案 1 :(得分:0)

这是一种将所有元素连接到1D数组然后按linear-indexing选择第一个元素的方法。实现看起来像这样 -

lens = np.array([len(item) for item in A])
out = np.concatenate(A)[np.append(0,lens[:-1].cumsum())]

瓶颈将与连接部分有关,但如果存在大量具有较小长度的元素,则可能会被抵消。因此,效率取决于输入数组的格式。