मेरे पास इस तरह की एक सरणी है और प्रत्येक 1 को 2 से, प्रत्येक 3 को 4 के साथ, प्रत्येक 4 को 1 से बदलने की आवश्यकता है। क्या ऐसा करने का कोई तरीका है np और लूप नहीं?

import numpy as np
np.random.seed(2)
arr=np.random.randint(1,5,(3,3),int)
arr

array([[1, 4, 2],
       [1, 3, 4],
       [3, 4, 1]])

यदि मैं क्रमिक रूप से सरणी मुखौटा का उपयोग करता हूं, तो यह अपेक्षित परिणाम नहीं देता है:

array([[2, 1, 2], 
       [2, 4, 1],
       [4, 1, 2]]) 

यह एक सशर्त तर्क पर आधारित है न कि गणित के फार्मूले पर

2
santoku 22 जिंदा 2020, 19:48

5 जवाब

सबसे बढ़िया उत्तर

यदि सरणी मान अनिवार्य रूप से 1 और 4 के बीच में नहीं हैं, तो आप np.select का उपयोग कर सकते हैं:

import numpy as np

a = np.random.randint(1,5, (3,3))


condlist = [np.logical_or(a==1, a==2),  a==3, a==4]
choicelist= [2, 4, 1]
b = np.select(condlist, choicelist) 

जो शर्तों के क्रम की परवाह नहीं करता

2
FBruzzesi 22 जिंदा 2020, 20:06

आप arr % 4 + 1 चाहते हैं, 2 के मामले को छोड़कर, जो समान रहता है। तो सभी 2s को खोजने के लिए np.where का उपयोग करें। फिर arr % 4 + 1 करें, फिर सभी 2s को रीसेट करें।

import numpy as np

np.random.seed(2)
arr=np.random.randint(1,5,(3,3),int)

twos = np.where(arr == 2)
arr = arr % 4 + 1
arr[twos] = 2
print(arr)
0
santoku 22 जिंदा 2020, 20:20

आपको असाइनमेंट के क्रम के बारे में सावधान रहना होगा। उदाहरण के लिए, यदि आप करते हैं

arr[arr == 4] = 1
arr[arr == 1] = 2

अब वे सभी तत्व जो मूल रूप से 4 थे, 2 होंगे, न कि 1 जैसा कि आप चाहते हैं।

एक समाधान असाइनमेंट के क्रम को सावधानीपूर्वक तैयार करना है:

arr[arr == 1] = 2
arr[arr == 4] = 1

हालांकि, यह बहुत भंगुर है और जैसे ही आप उनमें से अधिक परिचय देंगे, यह अलग हो जाएगा। मूल सरणी से मास्क को सामने बनाना बेहतर होगा:

ones = arr == 1
fours = arr == 4
arr[ones] = 2
arr[fours] = 1

अब असाइनमेंट का क्रम मायने नहीं रखेगा क्योंकि ऐरे को संशोधित करने से पहले मास्क निर्धारित किए जाते हैं।

0
Code-Apprentice 22 जिंदा 2020, 19:54

प्रदर्शन के लिए यहां np.searchsorted वाला एक है क्षमता -

def map_values(arr, old_val, new_val):
    sidx = old_val.argsort()
    idx = np.searchsorted(old_val,arr,sorter=sidx)
    return np.where(old_val[idx]==arr, new_val[sidx[idx]], arr)

सैंपल रन -

In [40]: arr
Out[40]: 
array([[1, 4, 2],
       [1, 3, 4],
       [3, 4, 1]])

In [41]: old_val = np.array([1,3,4])
    ...: new_val = np.array([2,4,1])

In [42]: map_values(arr, old_val, new_val)
Out[42]: 
array([[2, 1, 2],
       [2, 4, 1],
       [4, 1, 2]])
2
Divakar 22 जिंदा 2020, 20:08