Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python对象数组的Numpy矢量化_Python_Numpy_Scipy - Fatal编程技术网

python对象数组的Numpy矢量化

python对象数组的Numpy矢量化,python,numpy,scipy,Python,Numpy,Scipy,只是一个简短的问题,我在出发前找不到答案 当我这样做的时候: v1 = float_list_python = ... # <some list of floats> v2 = float_array_NumPy = ... # <some numpy.ndarray of floats> # I guess they don't have to be floats -

只是一个简短的问题,我在出发前找不到答案

当我这样做的时候:

v1 = float_list_python = ... # <some list of floats>
v2 = float_array_NumPy = ... # <some numpy.ndarray of floats>
                             # I guess they don't have to be floats - 
                             # but some object that also has a native 
                             # object in C, so that numpy can just use
                             # that
v1=float_list_python=…#
v2=浮点数组_NumPy=…#
#我想他们不必是花车-
#但是一些对象也有一个本机
#对象,这样numpy就可以使用
#那
如果我想用标量乘以这些向量,我的理解一直是python列表是一个对象引用列表,因此在列表中循环进行乘法必须获取所有浮点数的位置,然后必须获取浮点数才能进行乘法,这是它速度慢的原因之一

如果我在NumPy做同样的事情,那么,我不知道会发生什么。我认为会发生很多事情:

  • 它将多晶硅沿磁芯分开
  • 它将多通道(以及?)矢量化
  • 我找到的文档表明,numpy中的许多原语尽可能地利用了第一个选项(我手头上没有计算机,目前无法测试)。我的直觉告诉我,第二种情况应该尽可能发生

    所以我的问题是,如果我创建一个python对象的NumPy数组,它是否至少会并行执行列表上的操作?我知道如果创建一个具有本机C类型的对象数组,那么它实际上会在实际对象的内存中创建一个连续数组,如果您创建一个python对象的numpy数组,它将创建一个引用数组,但我不明白为什么这会排除上述列表上的并行操作,并且找不到任何明确说明这一点的地方


    编辑:我觉得我的问题有点混乱。我理解矢量化是什么,我理解它是一种编译器优化,而不是您必须编程的东西(尽管对齐数据使其在内存中连续很重要)。基于矢量化,我只想知道numpy是否使用它。如果我执行类似于
    np_array1*np_array2
    的操作,底层库调用是否使用矢量化(假定
    dtype
    是兼容类型)


    对于内核的拆分,我的意思是,如果我再次执行类似于
    np_array1*np_array2
    ,但是这次
    dtype=object
    :它会在这些内核之间拆分工作吗?

    numpy
    速度很快,因为它在快速编译的
    C
    代码中执行这样的数值操作。相反,列表操作在解释的Python级别上运行(使用Python字节码等尽可能简化)

    数值类型的
    numpy
    数组将这些数字存储在数据缓冲区中。至少在简单的情况下,这只是
    C
    code可以有效地一步通过的字节块。阵列还具有允许多维访问的形状和步幅信息

    当您将数组乘以标量时,它实际上会调用一个名为“multiply\u array\u by\u scalar”的
    C
    函数,该函数在快速编译的代码中执行乘法。因此,这种
    numpy
    操作速度很快(与Python列表代码相比),与内核数量或其他多处理/线程增强无关

    对象数组没有任何特殊的速度优势(与列表相比),至少目前没有

    看看我对一个关于创建数组的问题的回答, 我必须使用迭代来初始化这些值


    你做过时间实验吗?例如,构造一个数组,例如
    (1000,2)
    。使用
    tolist()
    创建等效的列表列表。并制作一个类似的对象数组,每个对象都是一个(2,)数组或列表(需要做多少工作?)。现在,为每个子列表执行一些简单的操作,如
    len(x)

    @hpaulj为您的问题提供了一个很好的答案。总的来说,通过阅读你的问题,我意识到你并不真正理解“矢量化”在引擎盖下的作用。这篇文章是对矢量化及其如何实现更快计算的一个相当不错的解释-


    关于第1点-跨多个核分布计算,Numpy的情况并不总是这样。但是,也有类似的库支持多线程、高效的Numpy数组计算,并支持几个基本的逻辑和算术运算符。当与Numpy结合使用时,Numexpr可用于对关键计算进行涡轮增压,因为它避免了在内存中复制用于矢量化例程的大型阵列(如Numpy的情况),并且可以使用系统上的所有内核来执行计算。

    我了解矢量化是什么,而且它显然不能用于对象数组(我认为“它是否至少会并行执行列表上的操作”部分的问题中暗示了这一点)。至于回答问题(你的第二段),“情况并非总是如此”——你知道具体是什么时候吗?这取决于是否编译numpy/scipy以链接到实现并行化的库。例如,英特尔有MKL库,如果您使用的是与MKL库一起运行的numpy编译,则可以在numpy计算中实现加速。这是Anaconda的付费选项(如果您是学生,则免费)。因此,没有一个通用的、通用的答案。单个numpy操作是否支持多线程/并行化与您的系统体系结构、可用的库以及本地numpy安装要使用的库有关。此处可能有用的更多信息:更多信息:好的,这使