我有两个维度为m-n-n的NumPy 3D数组:arr1arr2.每个内部数组是方阵(n-n).在我的单元测试工作中,arr1arr2应该是相同的,只是arr1中的任何内部矩阵中的任何一列都可以具有与arr2中的符号不同的符号.我想模仿一下函数numpy.testing.assert_almost_equal(arr1, arr2).即使有一些列具有不同的符号,它也应该输出True.你能告诉我怎么实现吗?提前谢谢!

下面是一个例子.在第一个内矩阵中,第二列具有不同的符号;在第二个内矩阵中,第三列具有不同的符号;并且第三个内矩阵具有相同的符号.请注意,不同的符号应用于整个列,而不是其中的一部分.

import numpy as np

arr1 = np.array([
    [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ],
    [
        [10, 20, 30],
        [40, 50, 60],
        [70, 80, 90]
    ],
    [
        [100, 200, 300],
        [400, 500, 600],
        [700, 800, 900]
    ]
])

arr2 = np.array([
    [
        [1, -2, 3],
        [4, -5, 6],
        [7, -8, 9]
    ],
    [
        [10, 20, -30],
        [40, 50, -60],
        [70, 80, -90]
    ],
    [
        [100, 200, 300],
        [400, 500, 600],
        [700, 800, 900]
    ]
])

np.testing.assert_almost_equal(arr1, arr2)  # How to re-write it so that the comparison results is `True`?

推荐答案

is_diff_signs = ((np.sign(arr1) * np.sign(arr2)) == -1).all(axis=1, keepdims=True)

real_total    = arr1 + arr2
ideal_total   = np.where(is_diff_signs, 0, real_total)

np.testing.assert_almost_equal(real_total, ideal_total)

如果两个数组除了某些列的全符号外是相等的,那么当符号一致时,它们的和应该是"正常"和,否则是0.

因此,我们首先形成一个掩码,说明"每列数组对在所有条目中是否共享相反的符号";如果是这样,则 Select 所需的和为0,否则 Select 正常和.

这是面具(它的形状是(3,1,3)(通孔keepdims),这样np.where就可以根据需要进行广播):

In [173]: is_diff_signs
Out[173]:
array([[[False,  True, False]],

       [[False, False,  True]],

       [[False, False, False]]])

这就是说"第一个内部数组的第二列和第二个内部数组的第三列符号完全不同".

Python-3.x相关问答推荐

Python ModuleNotFound错误,即使安装了模块

类型注释:pathlib. Path vs importlib. resources. abc. Traversable

确定字符串的长度并提取前15或14个字符

Python:字典和列表:在列表字典中搜索子列表的有效方法

将字符串转换为python日期时间时出错

PySpark每毫秒使用先前的值填充数据

逐行比较2个Pandas数据帧,并对每一行执行计算

如何统计一个值连续出现的次数?

Pandas DataFrame:使用 Pandas 将 NaN 值替换为 3 行以上的平均值

SqlAlchemy - 从 oracle db 中检索长文本

为什么最简单的流光示例会出错?

如何使用 Selenium by class_name 从大学橄榄球数据中抓取图像 url 列表

Python:获取未绑定的类方法

参数化泛型不能与类或实例判断一起使用

TensorFlow:dataset.train.next_batch 是如何定义的?

sys.stdin.readline() 读取时没有提示,返回 'nothing in between'

Selenium (Python) - 使用 Chrome 网络驱动程序等待下载过程完成

在 WSL (Ubuntu) 中为 python3 安装 venv

为什么 TensorFlow 的 `tf.data` 包会减慢我的代码速度?

Python 无法处理以 0 开头的数字字符串.为什么?