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

Numpy 从形状为(n,)的ndarray中的ndarray获取特定元素,numpy,multidimensional-array,indexing,Numpy,Multidimensional Array,Indexing,鉴于上述情况: 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.]

鉴于上述情况:

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.])

我建议将原始的锯齿阵列转换为单个屏蔽阵列:

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

我建议将原始的锯齿阵列转换为单个屏蔽阵列:

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

这里有一种方法,将所有元素连接到
1D
数组中,然后通过
线性索引选择第一个元素。实现如下所示-

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

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

这里有一种方法,将所有元素连接到
1D
数组中,然后通过
线性索引选择第一个元素。实现如下所示-

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

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

谢谢,这是两个答案中最快的一个。仍然没有我想的那么快,但肯定比我天真的方法有了改进。@jmc很高兴听到这比最初的方法有了改进,太棒了!谢谢,这是两个答案中最快的一个。仍然没有我想的那么快,但肯定比我天真的方法有了改进。@jmc很高兴听到这比最初的方法有了改进,太棒了!