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很高兴听到这比最初的方法有了改进,太棒了!