连接numpy数组后存储索引



我有一个这样的列表,

mylist = [
np.array([48.5, 38.0, 40.0]),
np.array([61.5, 52.5, 55.5, 46.5]),
np.array([35.5, 36.5]),
]

我想找到数组的索引,数组中特定值的位置以及mylist中的值。

我能够用np.concatenate(mylist)实现最后一列,但不知道如何有效地处理其余部分。

expected = np.vstack(
(
np.array([0, 0, 0, 1, 1, 1, 1, 2, 2]),
np.array([0, 1, 2, 0, 1, 2, 3, 0, 1]),
np.array([48.5, 38.0, 40.0, 61.5, 52.5, 55.5, 46.5, 35.5, 36.5]),
)
).T

它可以被读取为,即38在第一个数组中(索引=0(,并且它是该数组的第二个元素(索引=1(。

如果这真的是你想要的,这会满足你的要求。

import numpy as np
mylist = [
np.array([48.5, 38. , 40. ]),
np.array([61.5, 52.5, 55.5, 46.5 ]),
np.array([35.5, 36.5])]
a1 = []
a2 = []
for i,l in enumerate(mylist):
a1.extend( [i] * len(l) )
a2.extend( list(range(len(l))) )
final = np.array( [a1, a2, np.concatenate(mylist)] ).T
print(final)

输出:

[[ 0.   0.  48.5]
[ 0.   1.  38. ]
[ 0.   2.  40. ]
[ 1.   0.  61.5]
[ 1.   1.  52.5]
[ 1.   2.  55.5]
[ 1.   3.  46.5]
[ 2.   0.  35.5]
[ 2.   1.  36.5]]

您可以使用maplen来查找mylist中每个子列表的长度。然后在np.repeat中使用;X〃;协调。现在,在每个长度上应用np.arange以得到";Y";使用np.hstack对它们进行协调和连接。现在,只需np.column_stack将它们放在一起。

lens = list(map(len, mylist))
idx0 = np.repeat(np.arange(len(mylist)), lens) # [0, 0, 0, 1, 1, 1, 1, 2, 2]
idx1 = np.hstack([np.arange(v) for v in lens]) # [0, 1, 2, 0, 1, 2, 3, 0, 1]
vals = np.hstack(mylist) # [48.5, 38. , 40. , 61.5, 52.5, 55.5, 46.5, 35.5, 36.5]
out = np.column_stack([idx0, idx1, vals])
print(out)
[[ 0.   0.  48.5]
[ 0.   1.  38. ]
[ 0.   2.  40. ]
[ 1.   0.  61.5]
[ 1.   1.  52.5]
[ 1.   2.  55.5]
[ 1.   3.  46.5]
[ 2.   0.  35.5]
[ 2.   1.  36.5]]

最新更新