精确地与两个 numpy 矩阵中的浮点行相交

Intersect float rows in two numpy matrices with precision

我在 B 中寻找与 A 中任何行接近的行

示例: 每股收益 = 0.1

A = [[1.22, 1.33], [1.45, 1.66]]

B = [[1.25, 1.34], [1.77, 1.66], [1.44, 1.67]]

结果:[[1.22, 1.33], [1.45, 1.66]]

我同意 Pantsless 教授的观点 并将在此处扩展它的用途:

你的数组看起来像这样:

# array A
1.22 1.33
1.45 1.66

# array B
1.25 1.34
1.77 1.66

您想要的结果(根据您的 OP)与 A[0]1.22 1.33 匹配。这表明您希望 return 数组 A 中的行数组,其中与数组 'B' 的相同索引行相比,一行中的所有元素都是 < eps :

# array C
np.abs(A[0] - B[0]) # --> True  True
np.abs(A[1] - B[1]) # --> False True

这可以通过 boolean index 实现,使用:

>>> A[(np.abs(A-B) < eps).all(axis = 1)]

打破这条线:

>>> np.abs(A-B)
0.03 0.01
0.32 0.00
>>> np.abs(A-B) < eps
True  True
False True
# notice this matches the comments above
>>> (np.abs(A-B) < eps).all(axis = 1)
True False

(np.abs(A-B) < eps) return 是一个新的布尔数组,.all(axis = 1) 沿每行的第一个轴(按列方向)检查是否每行的所有元素都是True。由于数组C的第一行全是True,所以return就是True;这不适用于第二行,因为它的 False True 所以它 returns False。你剩下的是一个形状数组 (N, ).

所以现在最后的细分是:

>>> A[(np.abs(A-B) < eps).all(axis = 1)]
1.22 .133
# since this is access A like A[(True, False)]

w.r.t。您最新的 , you cannot do that because of NumPy's broadcasting rules. These rules are pretty similar to standard matrix multiplication 规则。所以你不能用 2x2 矩阵乘以 3x2 因为内部维度不起作用。

如果您希望过滤出 A 中与 B 中的 任何 元素接近的元素,您可以使用 broadcast tile 进行详尽检查:

import numpy as np

eps = .1
A = np.array([[1.22, 1.33], [1.45, 1.66]])
B = np.array([[1.25, 1.34], [1.77, 1.66], [1.44, 1.67]])


# broadcast A based on the shape of B
A_ext = np.broadcast_to(A, (B.shape[0],) + A.shape)

# tile B and reshape, this will allow comparison of all elements in A to all elements in B
B_ext = np.tile(B, A.shape[0]).reshape(A_ext.shape)

# create the boolean array
A_bool = np.abs(A_ext - B_ext) < eps

# reduce array to match number of elements in A
# .all() will result in an array representing which elements in A are close to each element in B
# .any() represents if A is close to any of the elements in B
A_mask = A_bool.all(axis = -1).any(axis = 0)

# final result
A[A_mask]