英文:
Finding elements of a list in an array in Python (Numpy, Pytorch)
问题
我正在处理以下问题:我有一个列表,假设 a=[1, 2, 3]
和一个数组 b=[[2, 4, 6],[3, 2, 5],[4, 1, 3]]
,列表中的元素数量等于数组中的行数,输出应该是一个列表 c=[-1, 1, 2]
,其中 -1
表示数字 a[0]
没有在数组 b
的第0行中找到,其他数字告诉了元素 a[i]
在行 b[i, :]
中的索引,索引从0开始。
我使用循环解决了这个问题,但我正在寻找一种更优化的方法,可以使用 np.where
或 torch 的替代方法来解决,我会感谢任何帮助。
英文:
I am dealing with the following problem: I have a list, let's say a=[1, 2, 3]
and an array b=[[2, 4, 6],[3, 2, 5],[4, 1, 3]]
, the number of elements in the list is equal to the number of rows in the array, the output should be a list c=[-1, 1, 2]
, where -1
indicates that the number a[0]
was not found in the 0-th row of the array b
, the other numbers tells the index where the element a[i]
is in the row b[i, :]
, the index enumeration starts at 0.
I solved it using loops but I am searching for a more optimal way to do it using np.where
or the torch alternative, I would appreciate any help.
答案1
得分: 2
import numpy as np
a = [1, 2, 3]
b = np.array([[2, 4, 6], [3, 2, 5], [4, 1, 3]])
# 通过将每个元素与a的对应元素进行比较来创建布尔掩码
mask = b == np.array(a)[:, np.newaxis]
# 找到掩码每行中第一个True的索引
indices = np.argmax(mask, axis=1)
# 使用np.where条件地分配匹配发生的索引,未匹配的地方分配-1
c = np.where(np.any(mask, axis=1), indices, -1).tolist()
print(c)
英文:
Try this
import numpy as np
a = [1, 2, 3]
b = np.array([[2, 4, 6], [3, 2, 5], [4, 1, 3]])
# Create a boolean mask by comparing each element of b with the corresponding element of a
mask = b == np.array(a)[:, np.newaxis]
# Find the index of the first occurrence of True along each row of the mask
indices = np.argmax(mask, axis=1)
# Use np.where to conditionally assign the indices where matches were found and -1 where no matches occurred
c = np.where(np.any(mask, axis=1), indices, -1).tolist()
print(c)
Or
import numpy as np
a = [1, 2, 3]
b = np.array([[2, 4, 6], [3, 2, 5], [4, 1, 3]])
c = []
for i in range(len(a)):
# Find the indices where the i-th element of a matches the elements in the i-th row of b
indices = np.where(b[i, :] == a[i])[0]
if len(indices) > 0:
# If indices are found, append the first index to the list c
c.append(indices[0])
else:
# If no indices are found, append -1 to the list c
c.append(-1)
print(c)
Output
[-1, 1, 2]
答案2
得分: 0
假设每行最多只有一个匹配项,你可以使用以下代码:
out = np.full_like(a, -1)
idx, vals = np.where(b == a[:,None])
out[idx] = vals
输出结果:array([-1, 1, 2])
可重现的输入数据:
a = np.array([1, 2, 3])
b = np.array([[2, 4, 6],[3, 2, 5],[4, 1, 3]])
英文:
Assuming at most one match per row, you could use:
out = np.full_like(a, -1)
idx, vals = np.where(b == a[:,None])
out[idx] = vals
Output: array([-1, 1, 2])
Reproducible input:
a = np.array([1, 2, 3])
b = np.array([[2, 4, 6],[3, 2, 5],[4, 1, 3]])
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论