我正在寻找找到numpy中两个数组之间精确重叠的最佳(最快)方法。给定两个数组x和y
x = array([1,0,3,0,5,0,7,4],dtype=int)
y = array([1,4,0,0,5,0,6,4],dtype=int)
我想得到的是一个长度相同的数组,只包含两个相等的数字:
array([1,0,0,0,5,0,0,4])
首先我试过
x&y
array([1,0,0,0,5,0,6,4])
然后我意识到,对于两个数字,如果它们是>则总是如此。 0
答案 0 :(得分:6)
result = numpy.where(x == y, x, 0)
查看numpy.where
文档以获取解释。基本上,numpy.where(a, b, c)
,对于条件a
,返回一个形状a
的数组,以及来自b
或c
的值,具体取决于是否相应的元素a
是否属实。 b
或c
可以是标量。
顺便说一下,对于两个正数,x & y
不一定“总是正确”。对于x
和y
中的元素,它bitwise-and:
x = numpy.array([2**p for p in xrange(10)])
# x is [ 1 2 4 8 16 32 64 128 256 512]
y = x - 1
# y is [ 0 1 3 7 15 31 63 127 255 511]
x & y
# result: [0 0 0 0 0 0 0 0 0 0]
这是因为x
中每个元素的按位表示形式为1
,后跟n
零,y
中的对应元素为{{1 1s。通常,对于两个非零数字n
和a
,b
可能等于零,或非零,但不一定等于a & b
或{{1} }。
答案 1 :(得分:2)
使用numpy.where
是最常用的解决方案。但在这种特殊情况下,并且因为它是一种有用的编程实践,您可以使用x==y
作为掩码:
mask = x==y
# mask is array([ True, False, False, True, True, True, False, True], dtype=bool)
xf = mask * x
# xf is array([1, 0, 0, 0, 5, 0, 0, 4])
或直接
xf = (x==y) * x
现在想象一些数据X
(例如声音为1D,图像为2D,电影为3D等)
(X<1) * -1. + (X>1) * 1.
返回值为-1
的数据,幅度低于1,否则为1.
。
答案 2 :(得分:0)
从文档中尝试numpy.in1d ....
测试1D数组的每个元素是否也存在于第二个数组中。
返回与ar1
长度相同的布尔数组,即True
其中ar1
的元素在ar2
中,否则为False。
ar1:array_like,shape(M,)
输入数组。
ar2:array_like
用于测试ar1
的每个值的值。
assume_unique:bool,可选
如果为True,则假定输入数组是唯一的,即
可以加快计算速度。默认值为False。
面具:bool的ndarray,形状(M,)
值ar1[mask]
位于ar2
。
numpy.lib.arraysetops:具有许多其他功能的模块 在数组上执行set操作。
in1d
可以被视为元素的函数版本
python关键字in
,用于1D序列。 in1d(a, b)
粗略地说
相当于np.array([item in b for item in a])
。
.. versionadded :: 1.4.0
test = np.array([0, 1, 2, 5, 0])
states = [0, 2]
mask = np.in1d(test, states)
mask
array([ True, False, True, False, True], dtype=bool)
test[mask]
array([0, 2, 0])