亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用位于 Mx2 numpy 數組中的元素替換 Nx3x2 numpy 數組中的元素

用位于 Mx2 numpy 數組中的元素替換 Nx3x2 numpy 數組中的元素

MMMHUHU 2022-12-20 14:18:35
我有以下xynumpy 數組,它表示一些三角形頂點的位置:array([[[ 0.30539728, 49.82845203],        [ 0.67235022, 49.95042185],        [ 0.268982  , 49.95195348]],       [[ 0.268982  , 49.95195348],        [ 0.67235022, 49.95042185],        [ 0.27000135, 50.16334035]],       ...       [[ 1.00647459, 50.25958169],        [ 0.79479121, 50.3010079 ],        [ 0.67235022, 49.95042185]],       [[ 0.79479121, 50.3010079 ],        [ 0.6886783 , 50.25867683],        [ 0.67235022, 49.95042185]]])在這里,它是一個形狀數組,(10, 3, 2)但它也可以是(5, 3, 2)or (18, 3, 2),你可以給它命名。無論如何它的形狀(N, 3, 2)。我有另一個 numpyto_replace形狀數組,(4, 2)但它也可以是(6, 2)or (7, 2),但總是形狀(M, 2):array([[ 1.08267406, 49.88690993],       [ 1.1028248 , 50.01440407],       [ 0.74114309, 49.73183549],       [ 1.08267406, 49.88690993]])它表示可以在我的第一個數組中找到的坐標對的位置。請注意,這些對中的每一對至少出現一次,xy但也可能出現不止一次。最后,我有第三個數組replace_by,其形狀(8,)(或(M*2)基于上述指示的形狀)和哪些值旨在準確替換to_replace我的第一個xy數組中包含的那些值。它看起來像這樣:array([ 0.87751214, 49.91866589,  0.88758751, 49.98241296,  0.70674665, 49.84112867,  0.87751214, 49.91866589])所以基本上所有的對[1.08267406, 49.88690993]都xy應該被替換[0.87751214, 49.91866589]為例如。我當前的代碼看起來像這樣,但它僅在to_replace和replace_by嚴格為 shape時才有效(2, 2)。indices = (xy == to_replace[:, None][:, None])[0]xy[indices] = replace_by我已經 看了很多答案,實際上從其中一些中得到了啟發,但我仍然無法讓它發揮作用。
查看完整描述

2 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

您可以使用numpy.isclose比較行,然后使用.all(axis=2)查找所有最后一行相同的位置。Numpy 將廣播每一行以適應xy形狀。


import numpy as np

xy = np.array([[[ 0.30539728, 49.82845203],

        [ 0.67235022, 49.95042185],

        [ 0.268982  , 49.95195348]],

       [[ 0.268982  , 49.95195348],

        [ 0.67235022, 49.95042185],

        [ 0.27000135, 50.16334035]],

       [[ 1.00647459, 50.25958169],

        [ 0.79479121, 50.3010079 ],

        [ 0.67235022, 49.95042185]],

       [[ 0.79479121, 50.3010079 ],

        [ 0.6886783 , 50.25867683],

        [ 0.67235022, 49.95042185]]])

xy_start = xy.copy()



to_replace = np.array([[ 1.08267406, 49.88690993],

       [ 1.1028248 , 50.01440407],

       # [ 0.74114309, 49.73183549],

       [ 0.6886783 , 50.25867683],

       [ 1.08267406, 49.88690993]])


replace_by = np.array([ 0.87751214, 49.91866589,  0.88758751, 49.98241296,  0.70674665, 49.84112867,  0.87751214, 49.91866589])

replace_by_reshaped = replace_by.reshape(-1, 2)


for i, row in enumerate(to_replace):

    xy[np.isclose(xy, row).all(axis=2)] = replace_by_reshaped[i]

print(xy_start)

# [[[ 0.30539728 49.82845203]

#   [ 0.67235022 49.95042185]

#   [ 0.268982   49.95195348]]


#  [[ 0.268982   49.95195348]

#   [ 0.67235022 49.95042185]

#   [ 0.27000135 50.16334035]]


#  [[ 1.00647459 50.25958169]

#   [ 0.79479121 50.3010079 ]

#   [ 0.67235022 49.95042185]]


#  [[ 0.79479121 50.3010079 ]

#   [ 0.6886783  50.25867683]

#   [ 0.67235022 49.95042185]]]

print(xy)

# [[[ 0.30539728 49.82845203]

#   [ 0.67235022 49.95042185]

#   [ 0.268982   49.95195348]]


#  [[ 0.268982   49.95195348]

#   [ 0.67235022 49.95042185]

#   [ 0.27000135 50.16334035]]


#  [[ 1.00647459 50.25958169]

#   [ 0.79479121 50.3010079 ]

#   [ 0.67235022 49.95042185]]


#  [[ 0.79479121 50.3010079 ]

#   [ 0.70674665 49.84112867]

#   [ 0.67235022 49.95042185]]]

編輯


.all(axis=2)True如果沿 axis=2 的所有值都是Trueand Falseelse ,則將axis=2 收縮。我認為 little 2d 示例清楚地說明了這里發生的事情。


>>> import numpy as np

>>> a = np.array([[0, 1], [0, 2], [3, 4]])

>>> a

array([[0, 1],

       [0, 2],

       [3, 4]])

>>> np.isclose(a, [0, 1])

array([[ True,  True],

       [ True, False],

       [False, False]])

>>> np.isclose(a, [0, 1]).all(axis=1)

array([ True, False, False])

>>> a[np.isclose(a, [0, 1]).all(axis=1)]

array([[0, 1]])

>>> a[np.isclose(a, [0, 1]).all(axis=1)] = [12, 14]

>>> a

array([[12, 14],

       [ 0,  2],

       [ 3,  4]])


查看完整回答
反對 回復 2022-12-20
?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

numpy-indexed包(免責聲明:我是它的作者)包含以矢量化和優雅的方式解決這個問題的功能。

鑒于您定義的數組,這個單行代碼應該可以解決問題:

import numpy_indexed as npi    
npi.remap(xy.reshape(-1, 2), to_replace, replace_by.reshape(-1, 2)).reshape(-1, 3, 2)


查看完整回答
反對 回復 2022-12-20
  • 2 回答
  • 0 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號