鉴于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.])
答案 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())]
瓶颈将与连接部分有关,但如果存在大量具有较小长度的元素,则可能会被抵消。因此,效率取决于输入数组的格式。