Tom*_*omK 5 python arrays numpy
我如何获得两个数组之间的按行比较,从而得到按行的真/假数组?
给定数据:
a = np.array([[1,0],[2,0],[3,1],[4,2]])
b = np.array([[1,0],[2,0],[4,2]])
Run Code Online (Sandbox Code Playgroud)
结果步骤1:
c = np.array([True, True,False,True])
Run Code Online (Sandbox Code Playgroud)
最终结果:
a = a[c]
Run Code Online (Sandbox Code Playgroud)
那么我如何获得阵列呢c
?
PS:在此示例中,数组a
和b
进行了排序,如果您的解决方案中数组的排序很重要,请提供信息
您可以将 numpy 与 apply_along_axis 一起使用(特定轴上的迭代类型,而 axis=0 在每个单元格上迭代,axis=1 在每一行上迭代,axis=2 在矩阵上等等
import numpy as np
a = np.array([[1,0],[2,0],[3,1],[4,2]])
b = np.array([[1,0],[2,0],[4,2]])
c = np.apply_along_axis(lambda x,y: x in y, 1, a, b)
Run Code Online (Sandbox Code Playgroud)
方法#1
我们可以使用view
基于矢量化的解决方案 -
# /sf/answers/3171934741/ @Divakar
def view1D(a, b): # a, b are arrays
a = np.ascontiguousarray(a)
b = np.ascontiguousarray(b)
void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
return a.view(void_dt).ravel(), b.view(void_dt).ravel()
A,B = view1D(a,b)
out = np.isin(A,B)
Run Code Online (Sandbox Code Playgroud)
样品运行 -
In [8]: a
Out[8]:
array([[1, 0],
[2, 0],
[3, 1],
[4, 2]])
In [9]: b
Out[9]:
array([[1, 0],
[2, 0],
[4, 2]])
In [10]: A,B = view1D(a,b)
In [11]: np.isin(A,B)
Out[11]: array([ True, True, False, True])
Run Code Online (Sandbox Code Playgroud)
方法#2
或者为案件时,所有行b
都是a
和行字典顺序排序,使用相同的views
,但是searchsorted
-
out = np.zeros(len(A), dtype=bool)
out[np.searchsorted(A,B)] = 1
Run Code Online (Sandbox Code Playgroud)
如果行不一定按字典顺序排序 -
sidx = A.argsort()
out[sidx[np.searchsorted(A,B,sorter=sidx)]] = 1
Run Code Online (Sandbox Code Playgroud)
这是向量化的解决方案:
res = (a[:, None] == b).all(-1).any(-1)
print(res)
array([ True, True, False, True])
Run Code Online (Sandbox Code Playgroud)
请注意,a[:, None] == b
将的每行a
与按b
元素进行比较。然后,我们使用all
+ any
来推断True
每个子数组是否有所有行:
print(a[:, None] == b)
[[[ True True]
[False True]
[False False]]
[[False True]
[ True True]
[False False]]
[[False False]
[False False]
[False False]]
[[False False]
[False False]
[ True True]]]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
257 次 |
最近记录: |