2つのアレイがあります。
b = np.array([[-2,1,1],[-99,1,0],[-12,0,1],[-100,0,0]])
z = np.array([[0,0,0],[0,1,1],[2,1,0],[-1,0,1]])
print(b)
[[ -2 1 1]
[ -99 1 0]
[ -12 0 1]
[-100 0 0]]
print(z)
[[ 0 0 0]
[ 0 1 1]
[ 2 1 0]
[-1 0 1]]
私が変更したいの[-2, -99, -12, -100]
は、最初の配列(b
)の最初の列()の値です。より具体的には、これらは、別の配列の(z
)と同じ2番目と3番目の列に基づいて変更する必要があります。
例えば、最初の行b
([ -2 1 1]
)は、(に変更されることになる[ 0 1 1]
第二(ため)1
)と第3の値(1
)最初の行の2列目と同じですz
([0 1 1]
)。ただし、行の順序はで維持したいと思いz
ます。したがって、
# b
[[ -2 1 1]
[ -99 1 0]
[ -12 0 1]
[-100 0 0]]
# would be ..
[[ 0 1 1]
[ 2 1 0]
[ -1 0 1]
[ 0 0 0]]
ループを使用することは避けられないようですが、Numpyスタイルのトリックで実装する方法は他にもあると思います。
あなたが使用することができnp.lexsort
、両方の間接的なソート(「ソートインデックス」とわずか1-D配列)を取得するb
と、z
2列目と3列目に一致するようにして、正確にそれぞれの行の最初の列を割り当てるには、高度な割り当てを使用します。
これを試して:
import numpy as np
b = np.array([[-2, 1, 1], [-99, 1, 0], [-12, 0, 1], [-100, 0, 0]])
z = np.array([[0, 0, 0], [0, 1, 1], [2, 1, 0], [-1, 0, 1]])
b_argsorted = np.lexsort((b[:, 1], b[:, 2]))
z_argsorted = np.lexsort((z[:, 1], z[:, 2]))
b[b_argsorted, 0] = z[z_argsorted, 0]
print(b)
出力(あなたのものと同じ):
[[ 0 1 1]
[ 2 1 0]
[-1 0 1]
[ 0 0 0]]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加