2013-09-26 3 views
5

मेरे पास [[6,7,8],[1,2,3],[1,2,3]] जैसे 3 डी numpy सरणी है और मैं पहले "बैंड" [6,7,8] का उपयोग अन्य सभी "बैंड" के लिए काल्पनिक मूल्यों के रूप में करना चाहता हूं। जोअन्य सभी बैंडों के लिए काल्पनिक मूल्यों के रूप में 3 डी numpy सरणी के पहले बैंड का उपयोग कैसे करें

[[6,7,8],[1+6j,2+7j,3+,8j],[1+6j,2+7j,3+8j]] 

किसी को पता होना चाहिए कि यह कैसे काम करता है? मदद के लिए धन्यवाद!

उत्तर

4

आमतौर पर लोग पहली पंक्ति के रूप में "पहला बैंड" वाक्यांश करते हैं।

>>> arr = np.array([[6,7,8],[1,2,3],[1,2,3]]) 

#First need a complex datatype. 
>>> arr = arr.astype(np.complex) 
>>> arr 
array([[ 6.+0.j, 7.+0.j, 8.+0.j], 
     [ 1.+0.j, 2.+0.j, 3.+0.j], 
     [ 1.+0.j, 2.+0.j, 3.+0.j]]) 

# .imag and .real access the real and imaginary parts of the array. 
>>> arr[1:].imag = arr[0].real 
>>> arr 
array([[ 6.+0.j, 7.+0.j, 8.+0.j], 
     [ 1.+6.j, 2.+7.j, 3.+8.j], 
     [ 1.+6.j, 2.+7.j, 3.+8.j]]) 

कई कास्टिंग कॉल छोड़ा जा रहा है और vstack समय भी पर्याप्त मात्रा में बचा सकते हैं: बड़े विन्यास के लिए

arr = np.array([[6,7,8],[1,2,3],[1,2,3]]) 

%timeit a=arr.astype(np.complex);a[1:].imag = a[0].real 
100000 loops, best of 3: 4.03 µs per loop 

%timeit np.vstack((arr[0,:], arr[1:,:] + arr[0,:] * 1.j)) 
10000 loops, best of 3: 25.2 µs per loop 

:

arr = np.random.rand(500,500) 

%timeit a=arr.astype(np.complex);a[1:].imag = a[0].real 
1000 loops, best of 3: 898 µs per loop 

In [13]: %timeit np.vstack((arr[0,:], arr[1:,:] + arr[0,:] * 1.j)) 
1000 loops, best of 3: 1.77 ms per loop 

अंतर मुख्य रूप से vstack विकल्प के लिए होने से आता है एक जटिल डेटा प्रकार के लिए दो बार कास्ट करें।

%timeit arr.astype(np.complex) 
1000 loops, best of 3: 530 µs per loop 
3

एक कॉम्पैक्ट समाधान।

>>> a = np.array([[6,7,8],[1,2,3],[1,2,3]]) 
>>> np.vstack((a[0,:], a[1:,:] + a[0,:] * 1.j)) 
array([[ 6.+0.j, 7.+0.j, 8.+0.j], 
     [ 1.+6.j, 2.+7.j, 3.+8.j], 
     [ 1.+6.j, 2.+7.j, 3.+8.j]]) 

को ध्यान में रखें कि नई सरणी जटिल है, इसलिए अपने पहली पंक्ति जटिल मूल्यों (शून्य रूप में काल्पनिक भाग के साथ) शामिल हैं, इस वजह से एक सरणी में सभी तत्वों को एक ही प्रकार का होना चाहिए है।

+0

इसे सरल बनाया जा सकता है: 'np.vstack ((a [0], a [1:] + a [0] * 1.j))'। – Daniel

+0

अच्छा बिंदु, आम तौर पर मैं सभी आयाम दिखाना चाहता हूं हालांकि अनावश्यक है। – jabaldonedo

संबंधित मुद्दे