【问题标题】:Comparing arrays and adding to different elements?比较数组并添加到不同的元素?
【发布时间】:2017-10-03 05:12:56
【问题描述】:
z = np.array([1, 2, 3, 4]) 
x = np.array([4, 2, 3, 5])
n = 1

我想比较这两个数组的元素,我只想将 n 添加到 z 中与 x 不同的元素。

答案应该是:

z = [2, 2, 3, 5]

【问题讨论】:

  • 你能恢复原来的问题并作为一个新问题提出这个问题吗?所有答案都与您的更新完全无关。
  • @Charles B 猜猜用这些编辑发布一个新问题是有意义的。
  • 我已经回滚了将问题更改为全新形式的编辑。请发布一个新问题。

标签: python arrays numpy elementwise-operations


【解决方案1】:

获取一个蒙版,对其进行缩放并就地添加 -

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

【讨论】:

    【解决方案2】:

    使用 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])
    

    【讨论】:

    • 改变了问题。希望你能理解我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多