查找矩阵中的每个元素是否与其在 3d 张量中转置的倒数

问题描述 投票:0回答:1

我有一个形状为 m * n * n 的 numpy 矩阵,这意味着我有 m 个 n*n 方阵。对于每个矩阵,我必须以这样的方式存在元素,以便转置索引彼此互为倒数。如果检测到任何事件或违规,则返回 False,否则返回 True。

在图像中,答案是正确的,因为我们有四个形状为 3*3 的矩阵,并且矩阵中的每个元素都是转置元素的倒数。

此代码将被部署,因此我希望该过程花费最少的时间并实现最大的并行度。

The image

我不知道如何处理它。我尝试过 ChatGPT,但它给了我可能最糟糕的结果

python numpy numpy-ndarray array-broadcasting
1个回答
0
投票

首先,请注意,在您的示例中,您的条件可能不满足,因为您想检查转置索引上的条目是否彼此完全相反。但是

0.11111111 * 9 != 1
。我假设值 0.11111111 是 1/9,但是 1/9 不能精确地存储为以 2 为基数的浮点数。

无论如何,要检查一个 n x n 数组是否满足您的要求,您可以将数组按元素与其转置矩阵相乘,并检查该矩阵中的所有元素是否均为 1:

import numpy as np

a = np.array([[1,0.25,4],[4,1,9], [0.25, 1/9, 1]])

b = np.multiply(a, a.T)

# check if any values in b are not 1
print(np.any(b != 1.0) 

如果您遇到精确相等的问题(如上所述),您可能需要使用 np.isclose() 来代替。

对于您的 m x n x n 数组,您可以简单地循环所有 m 数组。可能有更有效的方法,但据我所知,没有直接的方法将函数应用于 3D 数组的 2D 切片:

def check_reciprocal(mats: np.ndarray) -> bool:
   for mat in mats:
      if np.any(np.multiply(mat, mat.T) != 1.0):
         return False
    return True
© www.soinside.com 2019 - 2024. All rights reserved.