2013-06-04 6 views
6

अक्सर numpy के साथ काम करते समय मुझे परेशान परेशानी मिलती है - जब मैं एक मैट्रिक्स से वेक्टर या पंक्ति खींचता हूं और फिर np.array के साथ संचालन करता हूं तो आमतौर पर समस्याएं होती हैं।numpy np.array बनाम np.matrix (प्रदर्शन)

सिरदर्द को कम करने के लिए, मैंने कभी-कभी केवल np.matrix (सभी np.arrays को np.matrix में कनवर्ट करना) सरलता के लिए लिया है। हालांकि, मुझे संदेह है कि कुछ प्रदर्शन प्रभाव हैं। क्या कोई टिप्पणी कर सकता है कि वे क्या हो सकते हैं और क्यों कारण हैं?

ऐसा लगता है कि वे दोनों हुड के नीचे केवल सरणी हैं कि तत्व पहुंच केवल मूल्य प्राप्त करने के लिए ऑफ़सेट गणना है, इसलिए मुझे पूरा स्रोत नहीं है कि अंतर क्या हो सकता है।

अधिक विशेष रूप से, क्या प्रदर्शन निहितार्थ करता है यह है:

v = np.matrix([1, 2, 3, 4]) 
# versus the below 
w = np.array([1, 2, 3, 4]) 

धन्यवाद

+1

डुप्लिकेट [http://stackoverflow.com/questions/4151128/what-are-the-differences-between-numpy-arrays-and-matrices-which-one-should-iu](http://stackoverflow .com/प्रश्न/4151128/क्या-अंतर-अंतर-बीच-numpy-arrays-and-matrices-which-एक-चाहिए-iu) – jozzas

+1

हाँ, लेकिन मेरा प्रश्न प्रदर्शन के बारे में है, जिसका उल्लेख उस पोस्ट में नहीं है । मैं इस फोकस को और स्पष्ट करने के लिए अपना प्रश्न संपादित करूंगा। – lollercoaster

+2

मुझे संदेह है कि कोई महत्वपूर्ण प्रदर्शन प्रभाव पड़ता है, लेकिन यह जानने के बिना कि आप इसे बनाने के बाद ऑब्जेक्ट के साथ * क्या कर रहे हैं, यह जानने के बिना कहना मुश्किल है। कुछ टेस्ट फ़ंक्शंस क्यों न करें और 'टाइमिट' को आज़माएं? – mgilson

उत्तर

3

मैं कुछ और परीक्षण जोड़ा, और ऐसा लगता है कि एक arraymatrix से काफी तेज है जब सरणी/मैट्रिस छोटे होते हैं, लेकिन अंतर बड़ी डेटा संरचनाओं के लिए छोटा हो जाता है:

छोटे:

In [11]: a = [[1,2,3,4],[5,6,7,8]] 

In [12]: aa = np.array(a) 

In [13]: ma = np.matrix(a) 

In [14]: %timeit aa.sum() 
1000000 loops, best of 3: 1.77 us per loop 

In [15]: %timeit ma.sum() 
100000 loops, best of 3: 15.1 us per loop 

In [16]: %timeit np.dot(aa, aa.T) 
1000000 loops, best of 3: 1.72 us per loop 

In [17]: %timeit ma * ma.T 
100000 loops, best of 3: 7.46 us per loop 

बड़ा:

In [19]: aa = np.arange(10000).reshape(100,100) 

In [20]: ma = np.matrix(aa) 

In [21]: %timeit aa.sum() 
100000 loops, best of 3: 9.18 us per loop 

In [22]: %timeit ma.sum() 
10000 loops, best of 3: 22.9 us per loop 

In [23]: %timeit np.dot(aa, aa.T) 
1000 loops, best of 3: 1.26 ms per loop 

In [24]: %timeit ma * ma.T 
1000 loops, best of 3: 1.24 ms per loop 

सूचना है कि मैट्रिक्स वास्तव में गुणन के लिए थोड़ा तेजी से कर रहे हैं।

मेरा मानना ​​है कि जो मैं यहां प्राप्त कर रहा हूं वह है जो @ जैम टिप्पणी को समझा रहा है।

5

SciPy.org पर और this question पर एक सामान्य discusion नहीं है।

प्रदर्शन की तुलना करने के लिए, मैंने iPython में निम्नलिखित किया। यह पता चला है कि सरणी काफी तेजी से हैं।

In [1]: import numpy as np 
In [2]: %%timeit 
    ...: v = np.matrix([1, 2, 3, 4]) 
100000 loops, best of 3: 16.9 us per loop 

In [3]: %%timeit 
    ...: w = np.array([1, 2, 3, 4]) 
100000 loops, best of 3: 7.54 us per loop 

इसलिए numpy arrays numpy matrices की तुलना में तेज़ प्रदर्शन प्रतीत होता है।

संस्करण इस्तेमाल किया:

Numpy: 1.7.1

IPython: 0.13.2

अजगर 2.7

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