numpy 数组符号匹配

numpy array sign matching

我有两个形状为 (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)

然而,这显然没有起到作用。有帮助吗?

谢谢!

为什么不直接用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

希望对您有所帮助。