2009-04-21 27 views

Trả lời

95

Người ta không nên nghĩ quá nhiều về nó. Nó tốt hơn cho sức khỏe tâm thần và tuổi thọ của cá nhân.

Tình huống tò mò với các loại vô hướng có khối lượng đã được thực tế là không có cách nào duyên dáng và nhất quán để làm suy giảm ma trận 1x1 thành các loại vô hướng. Mặc dù toán học chúng giống nhau nhưng chúng được xử lý bằng mã rất khác nhau.

Nếu bạn đã thực hiện bất kỳ số lượng mã khoa học nào, cuối cùng bạn sẽ muốn những thứ như max(a) để hoạt động trên các ma trận thuộc mọi quy mô, thậm chí là vô hướng. Về mặt toán học, đây là một điều hoàn toàn hợp lý để mong đợi. Tuy nhiên đối với các lập trình viên, điều này có nghĩa là bất cứ thứ gì trình bày các scalars trong Numpy đều cần có .shape và .ndim attirbute, vì vậy ít nhất các ufuncs không cần phải kiểm tra kiểu rõ ràng trên đầu vào của nó cho 21 loại vô hướng có thể trong Numpy.

Mặt khác, chúng cũng phải hoạt động với các thư viện Python hiện có mà thực hiện thực hiện kiểm tra loại rõ ràng trên loại vô hướng. Đây là một tiến thoái lưỡng nan, vì một ndarray Numpy phải thay đổi kiểu riêng của nó khi chúng đã được giảm xuống một vô hướng, và không có cách nào để biết liệu điều đó có xảy ra mà không có kiểm tra trên mọi truy cập hay không. Trên thực tế đi tuyến đường đó có lẽ sẽ làm cho bit ridiculously chậm để làm việc với các tiêu chuẩn loại vô hướng.

Giải pháp của nhà phát triển Numpy là kế thừa từ cả hai thang đo ndarray và Python cho loại scalary riêng của nó, sao cho tất cả các scalars cũng có .shape, .ndim, .T, v.v ... Ma trận 1x1 sẽ vẫn ở đó, nhưng việc sử dụng nó sẽ không được khuyến khích nếu bạn biết bạn sẽ xử lý một vô hướng. Trong khi điều này sẽ làm việc tốt về mặt lý thuyết, thỉnh thoảng bạn vẫn có thể thấy một số nơi họ đã bỏ lỡ với các con lăn sơn, và các bộ phận bên xấu xí được tiếp xúc cho mọi người thấy:

>>> from numpy import * 
>>> a = array(1) 
>>> b = int_(1) 
>>> a.ndim 
0 
>>> b.ndim 
0 
>>> a[...] 
array(1) 
>>> a[()] 
1 
>>> b[...] 
array(1) 
>>> b[()] 
1 

Có thực sự không có lý do tại sao a[...]a[()] nên trả lại những thứ khác nhau, nhưng nó. Có những đề xuất để thay đổi điều này, nhưng có vẻ như họ đã quên hoàn thành công việc cho các mảng 1x1.

Một vấn đề có khả năng lớn hơn và có thể không giải quyết được, là thực tế là vô hướng Numpy là không thay đổi. Do đó "phun" một vô hướng vào trong một ndarray, toán học hoạt động nối tiếp của việc sụp đổ một mảng thành một vô hướng, là một PITA để thực hiện. Bạn có thể không thực sự phát triển một vô hướng NumPy, nó có thể không theo định nghĩa được đúc thành một ndarray, mặc dù newaxis một cách bí ẩn hoạt động trên nó:

>>> b[0,1,2,3] = 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'numpy.int32' object does not support item assignment 
>>> b[newaxis] 
array([1]) 

Trong Matlab, tăng kích thước của một đại lượng vô hướng là một cách hoàn hảo chấp nhận được và không có đầu óc hoạt động. Trong Numpy, bạn phải gắn chói tai a = array(a) ở mọi nơi bạn nghĩ rằng bạn sẽ có khả năng bắt đầu với một vô hướng và kết thúc bằng một mảng.Tôi hiểu tại sao Numpy phải là cách này để chơi tốt đẹp với Python, nhưng điều đó không thay đổi thực tế là nhiều switchers mới đang bối rối về điều này. Một số có bộ nhớ rõ ràng của đấu tranh với hành vi này và cuối cùng kiên trì, trong khi những người khác quá xa đã biến mất thường có một số vết sẹo tinh thần không bình thường sâu mà thường ám ảnh những giấc mơ ngây thơ nhất của họ. Đó là một tình huống xấu xí cho tất cả mọi người.

+21

+1 để giới thiệu về triết học :-) –

+3

Bạn đã cân nhắc đến sự nghiệp văn bản chưa? – KobeJohn

+4

Rất nhiều điều này dường như là cách thức matlab nhìn vào những thứ -_ "Bạn không thể thực sự phát triển một scalar Numpy" _ - cũng không phải bạn có thể phát triển một np.array. Rõ ràng về kích thước làm cho hành vi O (N^2) vô tình khó khăn hơn. _ "nó không thể định nghĩa được đưa vào trong một ndarray" _ - đó là những gì 'np.asarray (vô hướng)' nào. _ "ma trận 1x1 ..." _ - suy nghĩ về những thứ như vốn 2D, hoặc như ma trận, không hữu ích ở đây – Eric

4

Bạn phải tạo mảng vô hướng một chút khác nhau:

>>> x = numpy.float64(1.111) 
>>> x 
1.111 
>>> numpy.isscalar(x) 
True 
>>> numpy.ndim(x) 
0 

Dường như scalars in numpy có thể là một chút khái niệm khác với những gì bạn có thể được sử dụng để từ một quan điểm thuần túy toán học. Tôi đoán bạn đang suy nghĩ về ma trận vô hướng?

Các vấn đề liên quan