2013-03-20 31 views
9

Lưu ý: Tôi đã kiểm tra trùng lặp và không có câu trả lời nào rõ ràng cho câu hỏi của tôi. Tôi tin rằng bạn sẽ cho tôi biết nếu tôi bỏ lỡ một cái gì đó!Hướng dẫn nhập khẩu SciPy/NumPy

Trong nỗ lực dọn sạch mã của mình, tôi đã tìm kiếm một quy ước chuẩn để nhập SciPy và NumPy trong các chương trình của tôi. Tôi biết không có hướng dẫn nghiêm ngặt và tôi có thể làm theo cách tôi muốn, nhưng theo thời gian, tôi vẫn thấy những hướng dẫn mâu thuẫn.

Ví dụ, tôi đã đọc ở đâu đó rằng NumPy chỉ nhằm thực hiện đối tượng mảng, trong khi SciPy có sẵn cho mọi thuật toán khoa học khác. Vì vậy, NumPy nên được sử dụng cho hoạt động mảng và SciPy cho mọi thứ khác ... Mặt khác, SciPy nhập khẩu mọi chức năng Numpy trong không gian tên chính của nó, chẳng hạn như scipy.array() tương tự như numpy.array() (see this question), vì vậy chỉ nên được sử dụng khi SciPy không được sử dụng, vì chúng là các bản sao ...

Cách được khuyến nghị để làm việc với SciPy và NumPy là gì? Là một nhà khoa học, sqrt(-1) phải trả về một số phức tạp, vì vậy tôi chỉ muốn đi với SciPy.

Ngay bây giờ, mã của tôi bắt đầu với:

import numpy as np 
from scipy import * 
from matplotlib import pyplot as plt 

tôi sử dụng scipy cho phép toán (chẳng hạn như log10()) và NumPy để tạo mảng/hoạt động (chẳng hạn như np.zeros()). Nó sẽ là tốt để đi tất cả các cách với SciPy và không bao giờ nhập khẩu NumPy một cách rõ ràng? Một bản cập nhật trong tương lai có thể loại bỏ thao tác mảng của NumPy khỏi SciPy không?

+3

Tôi khuyên bạn nên nhận các biến thể đó của các hàm trực tiếp từ 'numpy.lib.scimath', nơi chúng được xác định, thay vì từ scipy. –

Trả lời

5

tôi khuyên bạn nên làm một cái gì đó giống như

import numpy as np 
import scipy as sp 

để thay thế. Việc làm from ... import * đặc biệt nguy hiểm với các mô-đun lớn như numpyscipy. Phần sau minh họa lý do:

>>> any(['foo']) 
True 
>>> from scipy import * 
>>> any(['foo']) 

Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    any(['foo']) 
    File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 1575, in any 
    return _wrapit(a, 'any', axis, out) 
    File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 37, in _wrapit 
    result = getattr(asarray(obj),method)(*args, **kwds) 
TypeError: cannot perform reduce with flexible type 

Điều gì xảy ra ở đây? Hàm xây dựng trăn tiêu chuẩn any được thay thế bằng scipy.any có hành vi khác nhau. Điều đó có thể phá vỡ bất kỳ mã nào sử dụng tiêu chuẩn any.

+0

Tôi nhận được sự nguy hiểm của 'từ ... import *', nhưng việc nhập cả scipy và gumpy là dư thừa, như là một phần mềm có trong scipy, và scipy tốt hơn cho máy tính khoa học. – PhilMacKay

+0

Sau đó, chỉ cần nhập 'scipy', nhưng không thực hiện' nhập từ scipy * '. – user763305

+0

Tôi đã chọn câu trả lời của bạn vì không có gì khác để thêm vào. Trong trường hợp của tôi, kể từ khi tôi làm máy tính khoa học tất cả các thời gian, tôi đã thử nghiệm bằng cách sử dụng chỉ 'nhập khẩu scipy như sp', và sử dụng' sp.stuff' cho tất cả mọi thứ. Trong môi trường tính toán tổng quát hơn, nơi scipy là không cần thiết, tôi cho rằng numpy sẽ là con đường để đi. Tôi không thể nghĩ ra một tình huống mà cả hai đều cần thiết cùng một lúc. – PhilMacKay

0

gì về việc các lớp học và sử dụng chỉ là những gì bạn sẽ cần, fx: lớp một:

import cv2 
from SIGBWindows import SIGBWindows 
from SIGBAssg import * 

lớp hai:

import cv2 
import numpy as np 

from pylab import * 
from scipy.cluster.vq import * 
from scipy.misc import imresize 

lớp ba:

import cv2 
import numpy as np 

và Cuối cùng, nơi chúng tôi gọi đối tượng:

import cv2 
from SIGBWindows import SIGBWindows 
from SIGBAssg import * 

windows = SIGBWindows(mode="video") 
windows.openVideo("somevideo.avi") 
kmeans(windows) 

Tôi không biết nếu đó là những gì bạn đang tìm kiếm, nhưng cách tiếp cận này làm cho mã thực sự sạch sẽ và dễ dàng để thêm nhiều tính năng hơn cho nó.

+0

umm, bạn đang trả lời câu hỏi nào? – MattDMo

+0

Hmmm ... Đó không phải là những gì tôi đang tìm kiếm. Mục tiêu chính của tôi là giữ cho mã dễ đọc và đơn giản nhất có thể, vì tôi muốn người khác (hoặc bản thân tôi trong một năm) có thể hiểu thuật toán của tôi dễ dàng. – PhilMacKay

+0

vâng tôi theo bạn trong đó, nhưng kể từ khi cả hai loại mảng là cần thiết để xử lý hình ảnh, tôi nghĩ rằng làm theo cách này là cách dễ nhất để làm cho mã dễ đọc hơn. – jycr753

1

Bài đăng này có một số thông tin tốt về hai mô-đun (Relationship between scipy and numpy). Dường như chức năng của Numpy có nghĩa là hoàn toàn được bao gồm trong Scipy, mặc dù có một vài ngoại lệ (xem bài đăng).Tôi sẽ nói rằng nó là an toàn để chỉ đơn giản là sử dụng Scipy cho tất cả các nhu cầu của bạn vì hầu hết những thứ quan trọng như chức năng toán học, mảng, và những thứ khác được bao gồm trong Scipy.

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