2012-09-13 25 views
9

से 3 डी प्लॉट बनाना ठीक है, इसलिए मुझे लगता है कि matplotlib का उपयोग करके 3-आयामी स्कैटर प्लॉट बनाने का एक आसान तरीका होना चाहिए। मैं 0 के साथ एक 3 डी numpy सरणी (dset) जहां मैं एक बिंदु नहीं चाहते हैं और है 1 के जहाँ मैं, मूल रूप से अब यह साजिश कि मैं इस तरह के रूप में तीन for: छोरों से निकलने के लिए है:3 डी numpy array

for i in range(30): 
    for x in range(60): 
     for y in range(60): 
      if dset[i, x, y] == 1: 
       ax.scatter(x, y, -i, zdir='z', c= 'red') 

कोई सुझाव मैं इसे और अधिक कुशलता से कैसे पूरा कर सकता हूं? किसी भी विचार की बहुत प्रशंसा की जाएगी।

उत्तर

14

आप एक dset उस तरह है, और तुम सिर्फ 1 मान प्राप्त करना चाहते हैं, तो आप nonzero,, जिनमें "सरणियों के एक टपल रिटर्न इस्तेमाल कर सकते हैं a के प्रत्येक आयाम के लिए, गैर शून्य के सूचकांकों युक्त उस आयाम में तत्व। "।

उदाहरण के लिए, हम एक सरल 3 डी सरणी बना सकते हैं:

>>> import numpy 
>>> numpy.random.seed(29) 
>>> d = numpy.random.randint(0, 2, size=(3,3,3)) 
>>> d 
array([[[1, 1, 0], 
     [1, 0, 0], 
     [0, 1, 1]], 

     [[0, 1, 1], 
     [1, 0, 0], 
     [0, 1, 1]], 

     [[1, 1, 0], 
     [0, 1, 0], 
     [0, 0, 1]]]) 

और पाते हैं जहां अशून्य तत्व स्थित हैं:

>>> d.nonzero() 
(array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2]), array([0, 0, 1, 2, 2, 0, 0, 1, 2, 2, 0, 0, 1, 2]), array([0, 1, 0, 1, 2, 1, 2, 0, 1, 2, 0, 1, 1, 2])) 
>>> z,x,y = d.nonzero() 

यदि हम एक और अधिक जटिल कटौती चाहता था, हम कर सकते थे (d > 3.4).nonzero() या कुछ ऐसा कुछ है, क्योंकि ट्रू में 1 का पूर्णांक मान होता है और nonzero के रूप में गिना जाता है।

अंत में, हम साजिश:

import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.scatter(x, y, -z, zdir='z', c= 'red') 
plt.savefig("demo.png") 

demo 3d image

+0

सुंदर दे रही है। मेरे पास '(d> 3.4) .nonzero()' भाग के बारे में कोई सवाल है, क्या वह केवल उन स्थानों को वापस कर देगा जहां डी का मूल्य 3.4 से अधिक है? – pter

+0

@pter: बिल्कुल सही। '(डी> 3.4) 'एक बूलियन सरणी को' सही 'के साथ' डी' के समान आकार देता है जहां प्रविष्टि> 3.4 और 'गलत' कहीं और है। – DSM

+0

मीठा मुझे इस बारे में पता नहीं था (आमतौर पर 3 डी प्लॉट की आवश्यकता नहीं होती है ... लेकिन अगर मैं ऐसा करता हूं तो यह बहुत ही अच्छा होगा!) धन्यवाद डीएसएम –