比较数组并添加到不同的元素?
Comparing arrays and adding to different elements?
z = np.array([1, 2, 3, 4])
x = np.array([4, 2, 3, 5])
n = 1
我想比较这两个数组的元素,我只想将 n 添加到 z 中与 x 中不同的那些元素。
答案应该是:
z = [2, 2, 3, 5]
获取遮罩,对其进行缩放并进行就地添加 -
z += n*(z!=x)
另一种只使用掩码的方法 -
z[z!=x] += n
样本运行 -
In [176]: z = np.array([1, 2, 3, 4])
...: x = np.array([4, 2 ,3 ,5])
...: n = 1
...:
In [177]: z += n*(z!=x)
In [178]: z
Out[178]: array([2, 2, 3, 5])
In [179]: z = np.array([1, 2, 3, 4])
In [180]: z[z!=x] += n
In [181]: z
Out[181]: array([2, 2, 3, 5])
运行时测试 -
接近 -
def app1(z, x, n):
z += n*(z!=x)
return z
def app2(z, x, n):
z[z!=x] += n
return z
def where_based(z, x, n): # @Allen's soln
z = np.where(z==x, z,z+n)
return z
计时 -
In [205]: z = np.random.randint(0,9,(1000000))
...: x = np.random.randint(0,9,(1000000))
...: n = 5
...:
...: zc1 = z.copy()
...: zc2 = z.copy()
...: zc3 = z.copy()
...:
In [206]: %timeit app1(zc1, x, n)
100 loops, best of 3: 2.82 ms per loop
In [207]: %timeit app2(zc2, x, n)
100 loops, best of 3: 7.95 ms per loop
In [208]: %timeit where_based(zc3, x, n)
100 loops, best of 3: 4.51 ms per loop
另一个解决方案使用 np.where
#np.where checks if the condition is met, if yes set the value to z, otherwise z+n.
np.where(z==x, z,z+n)
Out[1257]: array([2, 2, 3, 5])
z = np.array([1, 2, 3, 4])
x = np.array([4, 2, 3, 5])
n = 1
我想比较这两个数组的元素,我只想将 n 添加到 z 中与 x 中不同的那些元素。
答案应该是:
z = [2, 2, 3, 5]
获取遮罩,对其进行缩放并进行就地添加 -
z += n*(z!=x)
另一种只使用掩码的方法 -
z[z!=x] += n
样本运行 -
In [176]: z = np.array([1, 2, 3, 4])
...: x = np.array([4, 2 ,3 ,5])
...: n = 1
...:
In [177]: z += n*(z!=x)
In [178]: z
Out[178]: array([2, 2, 3, 5])
In [179]: z = np.array([1, 2, 3, 4])
In [180]: z[z!=x] += n
In [181]: z
Out[181]: array([2, 2, 3, 5])
运行时测试 -
接近 -
def app1(z, x, n):
z += n*(z!=x)
return z
def app2(z, x, n):
z[z!=x] += n
return z
def where_based(z, x, n): # @Allen's soln
z = np.where(z==x, z,z+n)
return z
计时 -
In [205]: z = np.random.randint(0,9,(1000000))
...: x = np.random.randint(0,9,(1000000))
...: n = 5
...:
...: zc1 = z.copy()
...: zc2 = z.copy()
...: zc3 = z.copy()
...:
In [206]: %timeit app1(zc1, x, n)
100 loops, best of 3: 2.82 ms per loop
In [207]: %timeit app2(zc2, x, n)
100 loops, best of 3: 7.95 ms per loop
In [208]: %timeit where_based(zc3, x, n)
100 loops, best of 3: 4.51 ms per loop
另一个解决方案使用 np.where
#np.where checks if the condition is met, if yes set the value to z, otherwise z+n.
np.where(z==x, z,z+n)
Out[1257]: array([2, 2, 3, 5])