gpt4 book ai didi

python - 根据 ID 值删除/保留 numpy 数组行

转载 作者:行者123 更新时间:2023-12-01 01:44:36 25 4
gpt4 key购买 nike

我有两个 numpy 数组,每个数组的第 0 列都有一个标识号。

如果每个数组的标识号匹配,我希望保留与这些 ID 号关联的相应行。

如果某个 ID 在另一个数组中没有匹配的 ID,我希望删除与该 ID 号关联的行,仅在该 ID 号出现的数组中删除。

这两个数组均按其 ID 号排序。

输入数组 a 和 b 以及输出数组 c 和 d 的示例可以在下面找到 - 请注意,数组的行数不同(注意,a 和 b 的实际示例要大得多 - (分别为 2487, 12) 和 (2482, 12))

在:

a =
[[9.60977, 97.5, 96, 99, 100.5, 1.60]
[9.60978, 97.5, 96, 100.5, 102, 0.31]
[9.60979, 97.5, 96, 102, 103.5, 0.11]
[9.60980, 97.5, 96, 103.5, 105, 0.05]
[9.60981, 97.5, 96, 105, 106.5, 0.03]
[9.60983, 97.5, 96, 108, 109.5, 0.01]
[9.60984, 97.5, 96, 109.5, 111, 0.01]]

b =
[[9.60977, 99, 100.5, 97.5, 96, 1.58]
[9.60979, 102, 103.5, 97.5, 96, 0.11]
[9.60980, 103.5, 105, 97.5, 96, 0.05]
[9.60981, 105, 106.5, 97.5, 96, 0.03]
[9.60982, 106.5, 108, 97.5, 96, 0.02]
[9.60984, 109.5, 111, 97.5, 96, 0.01]]

输出:

c =
[[9.60977, 97.5, 96, 99, 100.5, 1.60]
[9.60979, 97.5, 96, 102, 103.5, 0.11]
[9.60980, 97.5, 96, 103.5, 105, 0.05]
[9.60981, 97.5, 96, 105, 106.5, 0.03]
[9.60984, 97.5, 96, 109.5, 111, 0.01]]

d =
[[9.60977, 99, 100.5, 97.5, 96, 1.58]
[9.60979, 102, 103.5, 97.5, 96, 0.11]
[9.60980, 103.5, 105, 97.5, 96, 0.05]
[9.60981, 105, 106.5, 97.5, 96, 0.03]
[9.60984, 109.5, 111, 97.5, 96, 0.01]]

我尝试在 for 循环中使用一对 if 语句,但这会失败,因为 1) 数组长度不同(请参见下面的回溯),2) 它不会重新测试行一次一个值已被删除

for i in np.arange(0, max(len(a), len(b)), 1):
if a[i, 0] > b[i, 0]:
a = np.delete(a, i, 0)
if a[i, 0] < b[i, 0]:
b = np.delete(b, i, 0)

Traceback (most recent call last):

File "<ipython-input-271-509fc93aea3b>", line 2, in <module>
if a[i, 0] > b[i, 0]:

IndexError: index 4 is out of bounds for axis 0 with size 3

我也尝试过这个 while 循环,但它删除了数组 b 中所有错误的行

n = 0
s = max(len(a), len(b))
c = np.array(())
d = np.array(())
while n != s:
if a[n, 0] == b[n, 0]:
c = np.append(c, a[n, :])
d = np.append(d, b[n, :])
n = n+1
elif a[n, 0] > b[n, 0]:
a = np.delete(a, n, 0)
elif a[n, 0] < b[n, 0]:
b = np.delete(b, n, 0)
Traceback (most recent call last):

File "<ipython-input-285-f7c600c498cb>", line 6, in <module>
if a[n, 0] == b[n, 0]:

IndexError: index 1 is out of bounds for axis 0 with size 1

是否有更明智的方法可以使用 ID 号删除和追加行?

最佳答案

您可以使用np.isin查找每个数组中第一列中的值出现在另一个数组的第一列值中的位置。然后,这只是简单的索引问题。

c = a[np.isin(a[:,0],b[:,0])]

d = b[np.isin(b[:,0],a[:,0])]

>>> c
array([[ 9.60977000e+00, 9.75000000e+01, 9.60000000e+01,
9.90000000e+01, 1.00500000e+02, 1.60000000e+00],
[ 9.60979000e+00, 9.75000000e+01, 9.60000000e+01,
1.02000000e+02, 1.03500000e+02, 1.10000000e-01],
[ 9.60980000e+00, 9.75000000e+01, 9.60000000e+01,
1.03500000e+02, 1.05000000e+02, 5.00000000e-02],
[ 9.60981000e+00, 9.75000000e+01, 9.60000000e+01,
1.05000000e+02, 1.06500000e+02, 3.00000000e-02],
[ 9.60984000e+00, 9.75000000e+01, 9.60000000e+01,
1.09500000e+02, 1.11000000e+02, 1.00000000e-02]])
>>> d
array([[ 9.60977000e+00, 9.90000000e+01, 1.00500000e+02,
9.75000000e+01, 9.60000000e+01, 1.58000000e+00],
[ 9.60979000e+00, 1.02000000e+02, 1.03500000e+02,
9.75000000e+01, 9.60000000e+01, 1.10000000e-01],
[ 9.60980000e+00, 1.03500000e+02, 1.05000000e+02,
9.75000000e+01, 9.60000000e+01, 5.00000000e-02],
[ 9.60981000e+00, 1.05000000e+02, 1.06500000e+02,
9.75000000e+01, 9.60000000e+01, 3.00000000e-02],
[ 9.60984000e+00, 1.09500000e+02, 1.11000000e+02,
9.75000000e+01, 9.60000000e+01, 1.00000000e-02]])

说明:

 >>> np.isin(a[:,0],b[:,0])
array([ True, False, True, True, True, False, True], dtype=bool)

上面基本上只是向您展示了 a 第一列的值可以在 b 第一列中找到,然后您可以只索引 a 通过该 bool 数组,使用我上面显示的代码:

c = a[np.isin(a[:,0],b[:,0])]

关于python - 根据 ID 值删除/保留 numpy 数组行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51523666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com