我有兩個 numpy 3d 陣列,其維度為m-n-n:arr1和arr2. 每個內部陣列都是一個方陣 ( n-n)。在我的單元測驗作業中,arr1應該arr2是相同的,除了 in 任何內部矩陣中的任何列arr1可以具有與 in 不同的符號arr2。我想模仿這個功能numpy.testing.assert_almost_equal(arr1, arr2)。True即使有一些列有不同的符號,它也應該輸出。你能告訴我如何實作它嗎?提前致謝!
下面是一個例子。在第一個內矩陣中,第二列有不同的符號;在第 2 個內部矩陣中,第 3 列有不同的符號;第三個內部矩陣具有相同的符號。請注意,不同的符號應用于整個列,而不是其中的一部分。
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`?
uj5u.com熱心網友回復:
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。
所以我們首先形成一個掩碼,表示“每列陣列對是否在所有條目中共享相反的符號”;然后在這種情況下選擇所需的總和為 0,否則選擇正常總和。
這是面具(它的形狀為 (3, 1, 3) (via keepdims),以便np.where根據需要進行廣播):
In [173]: is_diff_signs
Out[173]:
array([[[False, True, False]],
[[False, False, True]],
[[False, False, False]]])
這表示“第一個內部陣列的第 2 列和第 2 個內部陣列的第 3 列符號完全不同”。
uj5u.com熱心網友回復:
類似于@Mustafa 的方法,但僅使用每個陣列的第一行(任意)的符號和廣播(我認為這更簡單)。
由于我們要斷言完全相等,一行足以測驗完整列是否匹配。
np.testing.assert_almost_equal(arr1 * np.sign(arr2[:,[0]]) * np.sign(arr1[:,[0]]), arr2)
# no error
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/505108.html
標籤:python-3.x 麻木的
