【问题标题】:numpy array sign matchingnumpy 数组符号匹配
【发布时间】:2020-05-18 16:19:38
【问题描述】:

我有两个形状为 (3, 4) 的 numpy 数组,其中包含带有随机符号的随机数:

x = np.random.normal(size = (3, 4))
y = np.random.normal(size = (3, 4))

x                                                                                                                             
'''
array([[-0.58970016, -1.35424573, -0.86332466, -1.15913228],
       [-1.78109087, -0.82991292,  0.94672891,  0.85399162],
       [ 0.78427527,  0.86797663, -1.33381457, -0.02626438]])
'''

y                                                                                                                             
'''
array([[ 0.45801392,  0.80853258, -0.69266633,  3.06853073],
       [ 1.58880983, -1.26883392,  2.16452527,  0.8143449 ],
       [ 1.40739241,  1.00436608,  0.0511364 ,  1.00537412]])
'''

我现在想根据 np 数组“x”中数字的符号更改 np 数组“y”中数字的符号。我想出的代码是:

np.where(np.sign(x) != np.sign(y), y, -y)                                                                                     
'''
array([[ 0.45801392,  0.80853258,  0.69266633,  3.06853073],
       [ 1.58880983,  1.26883392, -2.16452527, -0.8143449 ],
       [-1.40739241, -1.00436608,  0.0511364 ,  1.00537412]])
'''

我也试过了:

np.where((np.sign(x) != np.sign(y)) & (np.sign(x) > 0), y, -y)

但是,这显然不能胜任。有什么帮助吗?

谢谢!

【问题讨论】:

    标签: arrays numpy python-3.7


    【解决方案1】:

    为什么不直接使用y 的绝对值, np.abs(y),然后简单地对其应用x 的符号, np.sign(x) , 使用逐元素乘法 * ,得到:

    import numpy as np
    
    np.random.seed(42) # for reproducibility
    x = np.random.normal(size = (3, 4))
    >>> [[ 0.49671415 -0.1382643   0.64768854  1.52302986]
         [-0.23415337 -0.23413696  1.57921282  0.76743473]
         [-0.46947439  0.54256004 -0.46341769 -0.46572975]]
    
    y = np.random.normal(size = (3, 4))
    >>> [[ 0.24196227 -1.91328024 -1.72491783 -0.56228753]
         [-1.01283112  0.31424733 -0.90802408 -1.4123037 ]
         [ 1.46564877 -0.2257763   0.0675282  -1.42474819]]
    

    导致:

    y = np.sign(x)*np.abs(y)
    >>> [[ 0.24196227 -1.91328024  1.72491783  0.56228753]
         [-1.01283112 -0.31424733  0.90802408  1.4123037 ]
         [-1.46564877  0.2257763  -0.0675282  -1.42474819]]
    
    >>> np.allclose(np.sign(x),np.sign(y))
    >>> True
    

    希望这会有所帮助。

    【讨论】:

    • 好主意!我有复杂的方法。保持简单傻!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    相关资源
    最近更新 更多