我正在对2D列表和numpy数组进行一些实验.由此,我提出了3个问题,我很想知道答案.
首先,我初始化了一个2D python列表.
>>> my_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
然后我尝试使用元组索引列表.
>>> my_list[:,]
Traceback (most recent call last):
File "", line 1, in
TypeError: list indices must be integers, not tuple
由于解释器抛出了一个TypeError而不是一个SyntaxError,我猜测它实际上可以这样做,但是python本身并不支持它.
然后我尝试将列表转换为numpy数组并执行相同的操作.
>>> np.array(my_list)[:,]
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
当然没问题.我的理解是,其中一个__xx __()方法已被覆盖并在numpy包中实现.
Numpy的索引也支持列表:
>>> np.array(my_list)[:,[0, 1]]
array([[1, 2],
[4, 5],
[7, 8]])
这提出了几个问题:
>哪个__xx__方法有numpy覆盖/定义来处理花式索引?
>为什么python列表本身不支持花式索引?
此外,我运行此代码来比较python2与python3上的拼接性能.
import timeit
print(timeit.timeit("list_1[:][:]",
setup="list_1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]"))
print(timeit.timeit("list_2[:,]",
setup="import numpy as np; list_2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])"))
Python2(运行版本1.8.0rc1):
0.352098941803
1.24272298813
Python3(运行版本1.12.0):
0.23113773498334922
0.20699498101021163
这让我想到:
>为什么numpy的幻想索引在python2上如此之慢?是因为我在这个版本中没有本地BLAS支持numpy吗?
如果我能澄清任何事情,请告诉我.谢谢.
编辑
在python2上配置numpy:
>>> np.show_config()
...
blas_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3', '-I/BuildRoot/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.Internal.sdk/System/Library/Frameworks/vecLib.framework/Headers']
define_macros = [('NO_ATLAS_INFO', 3)]
...
lapack_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3']
define_macros = [('NO_ATLAS_INFO', 3)]
...
和python3一样:
>>> np.show_config()
....
blas_opt_info:
extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]
....
lapack_opt_info:
extra_compile_args = ['-msse3']
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
define_macros = [('NO_ATLAS_INFO', 3), ('HAVE_CBLAS', None)]