2014-11-24 11 views
6

के साथ नए निर्देशांक को जानने वाले 3 डी सरणी के मूल्यों को ले जाएं, मैं Stackoverflow पर पहले से चर्चा की गई समस्या का विस्तार करना चाहता हूं। यह 2 डी numpy arrays से निपट रहा था और मैं एक 3-आयामी सरणी के साथ ऐसा करना चाहता हूँ।मास्क

मैं 2 डी सरणी के तत्वों को नए समन्वय में "स्थानांतरित" करना चाहता हूं जो 2 अन्य सरणी में संग्रहीत हैं। मैं इसे स्वचालित करने के लिए देख रहा हूं, क्योंकि वास्तव में मेरे सरणी बड़े हैं (400x200x100)। कुछ मूल्यों को उनके निर्देशांक नहीं मिलेंगे और उनका उपयोग नहीं किया जाएगा, इनमें से कुछ निर्देशांक मास्क किए गए हैं, जिन्हें मैंने मान 0 का उपयोग करके नीचे दिए गए उदाहरण में इंगित किया है। यदि समन्वय मास्क किया गया है, तो सरणी में तत्व जिन्हें मैं फिर से बदलना चाहता हूं इस्तेमाल किया गया।

import numpy as np 

#My new coordinates in X and Y directions 

mx = np.array([[[ 1., 2., 3., 4., 0.], 
     [ 1., 2., 3., 4., 0.], 
     [ 1., 2., 3., 4., 0.], 
     [ 1., 2., 3., 4., 0.], 
     [ 1., 2., 3., 4., 0.]], 

     [[ 1., 2., 3., 4., 0.], 
     [ 1., 2., 3., 4., 0.], 
     [ 1., 2., 3., 4., 0.], 
     [ 1., 2., 3., 4., 0.], 
     [ 1., 2., 3., 4., 0.]]]) 

my = np.array([[[ 0., 2., 2., 2., 2.], 
     [ 0., 3., 3., 3., 3.], 
     [ 0., 4., 4., 4., 4.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]], 

     [[ 0., 2., 2., 2., 2.], 
     [ 0., 3., 3., 3., 3.], 
     [ 0., 4., 4., 4., 4.], 
     [ 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0.]]]) 


IRtest = np.array([[[-0.07383495, -0.08606554, -0.08480594, -0.08099556, -0.08218414], 
     [-0.07866761, -0.08373 , -0.08253587, -0.08106102, -0.08220205], 
     [-0.07727436, -0.08271511, -0.0807254 , -0.07832416, -0.08021686], 
     [-0.07612349, -0.08190446, -0.07996929, -0.07842754, -0.08024891], 
     [-0.07488144, -0.08150557, -0.08038229, -0.07895656, -0.07997815]], 

     [[-0.07383495, -0.08606554, -0.08480594, -0.08099556, -0.08218414], 
     [-0.07866761, -0.08373 , -0.08253587, -0.08106102, -0.08220205], 
     [-0.07727436, -0.08271511, -0.0807254 , -0.07832416, -0.08021686], 
     [-0.07612349, -0.08190446, -0.07996929, -0.07842754, -0.08024891], 
     [-0.07488144, -0.08150557, -0.08038229, -0.07895656, -0.07997815]]]) 

तो सरणी की उम्मीद लगता है:

array_expected = np.array([[[-0.08271511, -0.0807254 , -0.07832416, -0.08021686, 0], 
     [-0.08190446, -0.07996929, -0.07842754, -0.08024891, 0], 
     [-0.08150557, -0.08038229, -0.07895656, -0.07997815, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0]], 

     [[-0.08271511, -0.0807254 , -0.07832416, -0.08021686, 0], 
     [-0.08190446, -0.07996929, -0.07842754, -0.08024891, 0], 
     [-0.08150557, -0.08038229, -0.07895656, -0.07997815, 0], 
     [0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0]]]) 

मैं कोड का हिस्सा मैं अपने पिछले पोस्ट के साथ मिल गया के साथ प्रयास करें।

b = np.zeros_like(IRtest) 

for i in range(IRtest.shape[1]): 
    for j in range(IRtest.shape[2]): 
     for k in range(IRtest.shape[0]): 
      b[k, j, i] = IRtest[k,my[k,j,i],mx[k,j,i]]*(mx[k,j,i]!=-1)*(my[k,j,i]!=-1)  

b 

लेकिन इसके साथ ही टी परिणाम प्रतिसाद नहीं मैं उम्मीद:

array([[[-0.08606554, -0.0807254 , -0.07832416, -0.08021686, -0.07727436], 
     [-0.08606554, -0.07996929, -0.07842754, -0.08024891, -0.07612349], 
     [-0.08606554, -0.08038229, -0.07895656, -0.07997815, -0.07488144], 
     [-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495], 
     [-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495]], 

     [[-0.08606554, -0.0807254 , -0.07832416, -0.08021686, -0.07727436], 
     [-0.08606554, -0.07996929, -0.07842754, -0.08024891, -0.07612349], 
     [-0.08606554, -0.08038229, -0.07895656, -0.07997815, -0.07488144], 
     [-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495], 
     [-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495]]]) 
+0

मैं शायद कुछ गलत, लेकिन क्यों पहले कॉलम भरा नहीं है अपेक्षित परिणाम में '0' के साथ? –

+0

यह एक गलती थी कि मैं निर्देशांक और मूल्यों को बदलता हूं, मैंने 2 डी मामले के लिए अपनी पोस्ट के समान ही लिया! ;) – user3601754

उत्तर

4

आपका मानचित्र मैट्रिक्स गलत कर रहे हैं, परिणाम आप चाहते हैं पाने के लिए वे (इस तरह के होने की जरूरत है के बाद से, जब आप मान डाल ख में, आप जाँच कर रहे हैं, तो मीटर [k, जे, मैं]! = -1 और आप चाहते हैं पिछले कॉलम 0, नहीं सबसे पहले)

mx = np.array([[[ 1., 2., 3., 4., -1.], 
     [ 1., 2., 3., 4., -1.], 
     [ 1., 2., 3., 4., -1.], 
     [ 1., 2., 3., 4., -1.], 
     [ 1., 2., 3., 4., -1.]], 

     [[ 1., 2., 3., 4., -1.], 
     [ 1., 2., 3., 4., -1.], 
     [ 1., 2., 3., 4., -1.], 
     [ 1., 2., 3., 4., -1.], 
     [ 1., 2., 3., 4., -1.]]]) 

my = np.array([[[ 2., 2., 2., 2., -1.], 
     [ 3., 3., 3., 3., -1.], 
     [ 4., 4., 4., 4., -1.], 
     [ -1., -1., -1., -1., -1.], 
     [ -1., -1., -1., -1., -1.]], 

     [[ 2., 2., 2., 2., -1.], 
     [ 3., 3., 3., 3., -1.], 
     [ 4., 4., 4., 4., -1.], 
     [ -1., -1., -1., -1., -1.], 
     [ -1., -1., -1., -1., -1.]]]) 
इसके अलावा अपने छोरों में

होने के लिए, यह बेहतर होगा पहले और दूसरे loo में आयाम स्विच करने के लिए ps तो वे बन

for i in range(IRtest.shape[2]): 
    for j in range(IRtest.shape[1]): 
     for k in range(IRtest.shape[0]): 

इस मामले में तुम यहाँ दे के बाद से मैट्रिक्स वर्ग रहे हैं के लिए कोई फर्क नहीं पड़ता, लेकिन असली समस्या आप मैट्रिक्स वर्ग नहीं कर रहे हैं उल्लेख है, तो यह एक समस्या बन जाता है।

1

the answer to your previous question के बारे में 2dim संक्षेप में, आप बस कल्पना अनुक्रमण की तरह (अपने सरणियों के dtypes ठीक करने के बाद, निश्चित रूप से) का उपयोग कर सकते हैं:

b = IRtest[my,mx] * ~(mask_my | mask_mx) 

अब, आदेश उसी तकनीक लागू करने के लिए 3 डीआईएम मामले में, आपको पहले धुरी पर लागू करने के लिए "तटस्थ" अनुक्रमणिका सरणी बनाने की आवश्यकता है। यह वह जगह है जहां np.indices उपयोगी आता है:

mz = np.indices(IRtest.shape)[0] # take [0] because we need to be neutral w.r.t. axis=0 

अब फैंसी अनुक्रमण लागू होते हैं:

b = IRtest[mz, my, mx] 

मुखौटा लागू करने के लिए यह आदेश यह 3dim बनाने के लिए मुखौटा सरणी के लिए एक आयाम जोड़ने के लिए सबसे आसान है , तो numpy के प्रसारण को अपने जादू करने दें। (मुझे लगता है कि हम ddpe = bool के साथ, 2dim प्रश्न से एक ही मास्क का उपयोग कर रहे हैं)।

unified_mask = mask_my | mask_mx 
b *= ~unified_mask[np.newaxis,...] 

2dim मामले में, आप alrenatively फैंसी-असाइनमेंट इस्तेमाल कर सकते हैं (फिर से, अक्ष = 0 प्रसारित किया जा रहा है):

b[unified_mask[np.newaxis,...]] = 0. 
संबंधित मुद्दे