GVKun编程网logo

SciPy 和 NumPy 之间的关系(scipy与numpy的区别)

11

在本文中,我们将带你了解SciPy和NumPy之间的关系在这篇文章中,我们将为您详细介绍SciPy和NumPy之间的关系的方方面面,并解答scipy与numpy的区别常见的疑惑,同时我们还将给您一些技

在本文中,我们将带你了解SciPy 和 NumPy 之间的关系在这篇文章中,我们将为您详细介绍SciPy 和 NumPy 之间的关系的方方面面,并解答scipy与numpy的区别常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的cvxpy 和 numpy 之间的版本冲突:“针对 API 版本 0xe 编译的模块,但此版本的 numpy 是 0xd”、Linux下Python科学计算包numpy和SciPy的安装、macOS 安装 pypy3 + numpy + scipy 实录、Numpy / Scipy中的卷积计算

本文目录一览:

SciPy 和 NumPy 之间的关系(scipy与numpy的区别)

SciPy 和 NumPy 之间的关系(scipy与numpy的区别)

SciPy 似乎在其自己的命名空间中提供了 NumPy 的大部分(但不是全部 [1])函数。换句话说,如果有一个名为
的函数numpy.foo,几乎肯定会有一个scipy.foo. 大多数时候,两者看起来完全一样,甚至经常指向同一个函数对象。

有时,它们是不同的。举一个最近出现的例子:

  • numpy.log10是一个ufunc,它为负参数返回 NaN;
  • scipy.log10返回负参数的复数值,并且看起来不是 ufunc。

log关于,log2和也可以这样说logn,但关于log1p[2] 则不然。

另一方面,numpy.exp对于scipy.exp同一个 ufunc
来说似乎是不同的名称。scipy.log1p和也是如此numpy.log1p

另一个例子是numpy.linalg.solvevs scipy.linalg.solve。它们是相似的,但后者比前者提供了一些额外的功能。

为什么会出现明显的重复?如果这是numpyscipy命名空间的大规模导入,为什么会有细微的行为差异和缺少的功能?是否有一些总体逻辑可以帮助消除混乱?

[1] numpy.minnumpy.maxnumpy.abs其他一些在命名空间中没有对应scipy项。

[2] 使用 NumPy 1.5.1 和 SciPy 0.9.0rc2 进行测试。

cvxpy 和 numpy 之间的版本冲突:“针对 API 版本 0xe 编译的模块,但此版本的 numpy 是 0xd”

cvxpy 和 numpy 之间的版本冲突:“针对 API 版本 0xe 编译的模块,但此版本的 numpy 是 0xd”

如何解决cvxpy 和 numpy 之间的版本冲突:“针对 API 版本 0xe 编译的模块,但此版本的 numpy 是 0xd”?

我正在尝试升级一些软件包并为现有的 Python 程序整合我的 requirements.txt,以便将其移至 docker 容器。

这个容器将基于 tensorflow docker 容器,这决定了我必须使用的一些包版本。我们在 windows 下工作,我们希望能够在我们的机器上本地运行该程序(至少在一段时间内)。所以我需要找到一个适用于 docker 和 Windows 10 的配置。

Tensorflow 2.4.1 需要 numpy~=1.19.2。使用 numpy 1.20 时,pip 会抱怨 numpy 1.20 是一个不兼容的版本。

但是在使用 numpy~=1.19.2 时,导入 cvxpy 时出现以下错误。 pip 安装所有软件包都很好:

RuntimeError: module compiled against API version 0xe but this version of numpy is 0xd
Traceback (most recent call last):
  File "test.py",line 1,in <module>
    import cvxpy
  File "c:\Projekte\algo5\venv\lib\site-packages\cvxpy\__init__.py",line 18,in <module>
    from cvxpy.atoms import *
  File "c:\Projekte\algo5\venv\lib\site-packages\cvxpy\atoms\__init__.py",line 20,in <module>
    from cvxpy.atoms.geo_mean import geo_mean
  File "c:\Projekte\algo5\venv\lib\site-packages\cvxpy\atoms\geo_mean.py",in <module>
    from cvxpy.utilities.power_tools import (fracify,decompose,approx_error,lower_bound,File "c:\Projekte\algo5\venv\lib\site-packages\cvxpy\utilities\power_tools.py",in <module>
    from cvxpy.atoms.affine.reshape import reshape
  File "c:\Projekte\algo5\venv\lib\site-packages\cvxpy\atoms\affine\reshape.py",in <module>
    from cvxpy.atoms.affine.hstack import hstack
  File "c:\Projekte\algo5\venv\lib\site-packages\cvxpy\atoms\affine\hstack.py",in <module>
    from cvxpy.atoms.affine.affine_atom import AffAtom
  File "c:\Projekte\algo5\venv\lib\site-packages\cvxpy\atoms\affine\affine_atom.py",line 22,in <module>
    from cvxpy.cvxcore.python import canonInterface
  File "c:\Projekte\algo5\venv\lib\site-packages\cvxpy\cvxcore\python\__init__.py",line 3,in <module>
    import _cvxcore
ImportError: numpy.core.multiarray Failed to import

重现步骤:

1.) 在 Windows 10 下创建一个新的 Python 3.8 venv 并激活它

2.) 通过 requirements.txt 安装以下 pip install -r requirements.txt

cvxpy 
numpy~=1.19.2 # tensorflow 2.4.1 requires this version

3.) 通过 test.py

执行以下 python test.py
import cvxpy

if __name__ == ''__main__'':
    pass

如果我想使用 tensorflow 2.3,也会发生同样的事情。在这种情况下需要 numpy~=1.18,错误完全相同。

搜索错误发现很少的命中,可悲的是没有帮助我。

我该怎么做才能解决这个问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Linux下Python科学计算包numpy和SciPy的安装

Linux下Python科学计算包numpy和SciPy的安装

 

系统环境:

OS:RedHat5

Python版本:Python2.7.3

gcc版本:4.1.2

 

各个安装包版本:

scipy-0.11.0

numpy-1.6.2

nose-1.2.1

lapack-3.4.2

atlas-3.10.0

 

依赖关系:scipy的安装需要依赖于numpy、lapack、atlas(后两者都是线性代数工具包),而numpy和sci的测试程序的运行又依赖于nose,因此,整个安装过程必须要按顺序执行的,否则是无法执行下去的。

 

安装步骤:

1、安装nose

这个安装比较简单,解压缩nose的安装文件,进入nose的目录,直接运行setup.py即可:

tar -zxvf nose-1.2.1.tar.gz

cd nose-1.2.1

python setup.py install

 

2、安装lapack

由于最新版本的ATLAS可以直接集成lapack的安装压缩文件进行编译,因此,如果仅在python下使用的话,可以不用安装lapack。只需要下载压缩文件:lapack-3.4.2.tgz 即可。

 

3、安装ATLAS

这个的安装主要是配置一些选项,包括配置成64位库文件、位置无关的以及共享的链接库。详细的配置说明在atlas安装包 doc/ 下的pdf文件中。可查阅。

下面是我的安装过程:

tar -jxvf atlas3.10.0.tar.bz2

cd ATLAS

mkdir obj64

../configure -b 64 -Fa alg -fPIC -shared --prefix=/配置atlas的安装路径/atlas --with-netlib-lapack-tarfile=/lapack安装压缩文件存放的目录/lapack-3.4.2.tgz

(注:这个配置时间非常长,在Core i7 处理上,大概1个小时左右)

make

(下面是一些检查过程,保证没有问题之后再进行安装)

make check

make time

make install

至此,atlas安装完成。不过我们要记录下编译过程中所用的fortran编译器类型,这个信息在下面安装numpy和scipy的时候要用。还是在目录 obj64/ 下,执行

fgrep "F77 =" Make.inc
可以看到  F77 = gfortran
记下这个编译器类型 gfortran.

 

4、安装numpy

numpy和scipy的安装过程都要显式的指明所用fortran编译器的类型,而且要与前面编译atlas时一致(在本文中即:gfortran),这一点非常重要,否则很多功能都会出错。

首先配置numpy目录下的site.cfg文件,指明atlas库的位置:

tar -zxvf numpy-1.6.2.tar.gz

cd numpy-1.6.2

cp site.cfg.example site.cfg

vim site.cfg

配置成如下格式:

[DEFAULT]
library_dirs = /usr/local/lib:/atlas的安装目录/atlas/lib
include_dirs = /usr/local/include:/atlas的安装目录/include

[blas_opt]
libraries = f77blas, cblas, atlas

[lapack_opt]
libraries = lapack, f77blas, cblas, atlas

[amd]
amd_libs = amd
[umfpack]
umfpack_libs = umfpack

 

接下来配置安装numpy所需要的Fortran编译器类型:

如果前面得到的Fortran编译器是gfortran的话,执行:

 python setup.py build --fcompiler=gnu95

如果前面得到的Fortran编译器是g77的话,执行:

 python setup.py build --fcompiler=gnu

 

然后执行

python setup.py install

安装完成

 

5、安装scipy

与安装numpy类似:

tar -zxvf scipy-0.11.0.tar.gz

cd scipy-0.11.0

vim site.cfg

配置成如下格式:

[DEFAULT]
library_dirs = /usr/local/lib:/atlas的安装目录/atlas/lib
include_dirs = /usr/local/include:/atlas的安装目录/include

[blas_opt]
libraries = f77blas, cblas, atlas

[lapack_opt]
libraries = lapack, f77blas, cblas, atlas

[amd]
amd_libs = amd
[umfpack]
umfpack_libs = umfpack

 

接下来配置安装numpy所需要的Fortran编译器类型:

如果前面得到的Fortran编译器是gfortran的话,执行:

 python setup.py build --fcompiler=gnu95

如果前面得到的Fortran编译器是g77的话,执行:

 python setup.py build --fcompiler=gnu

 

然后执行

python setup.py install

安装完成

 

然后可以在python下执行相应的测试程序:

python

>>> import nose

>>> import numpy

>>> import scipy

>>> numpy.test('full')

>>> scipy.test('full')

 

REF:

http://blog.sina.com.cn/s/blog_62dfdc740101aoo6.html

macOS 安装 pypy3 + numpy + scipy 实录

macOS 安装 pypy3 + numpy + scipy 实录

pypy 是一个支持 JIT 技术的 python 解释器实现,在某些任务上可以期待有比 cpython 更好的性能。但由于很多 python 包使用了特殊的 cpython 扩展接口,难以被 cpython 支持。特别是机器学习、科学计算流行的软件包,现在通常通过 anaconda 直接安装预编译包,难以支持 pypy. 一直好奇 pypy 在科学计算任务上会不会比 cpython 有优势,折腾了一晚上在 macOS 上安装了 pypy3 + numpy + scipy + matplotlib + scikit-learn + matplotlib, 在这里记录一下。

首先需要安装 pypy3 本身和编译器。可以通过 homebrew 安装:

brew install pypy3 gcc g++ gfortran

此时 pypy3 & pip 已经可以使用。可以使用 pypy3 命令替代 python3 命令运行一些脚本:

pip_pypy3 install package_name
pypy3  # start pypy3

注意,如果当前有 conda env, virtualenv 处于激活状态,先将其 deactivate. 有时候 pypy3 没有正确设置环境变量,会有一些警告,但在我的测试过程中只有警告,没有出现错误。以及,pypy3 默认安装带的包比较少,可能会出现各种 ImportError, 一般可以使用 pip_pypy3 安装对应的包解决。

「纯 python 软件包」的安装一般可以成功,只有 numpy 这种带有 C 扩展、还需要链接其他库的包安装比较麻烦。为了安装 numpy, 首先需要安装某个数学加速库。这里建议安装 OpenBLAS. 直接安装预编译的 OpenBLAS 似乎是不行的,可能是由于预编译的编译器版本与本地不一致。因此直接从 github 拉取最新版并编译安装:

git clone https://github.com/xianyi/OpenBLAS.git
cd OpenBLAS
make
# default install into /opt/OpenBLAS
sudo make install

注意,anaconda 里的 numpy 链接的是 intel mkl. 可以尝试搜索从 intel 官网安装这个软件包,作为 root 安装时,这个软件包会被安装在 opt/intel/mkl. 我没有尝试链接 intel mkl, 不知道能否成功。

之后编译安装 numpy & scipy. 这两个软件包从 pip 安装会失败,因此仍然从 github 拉取源码。这里以 numpy 为例,scipy 是同一个组织的软件包,安装步骤完全相同。

# install wheel at first
pip_pypy3 install wheel
git clone https://github.com/numpy/numpy.git

从 pip 安装失败是因为链接不到 OpenBLAS. 从一篇博客了解到,需要在 numpy 源代码根目录下添加一个文件 site.cfg, 指定 OpenBLAS 位置:

[DEFAULT]
library_dirs = /opt/OpenBLAS/lib
include_dirs = /opt/OpenBLAS/include

[atlas]
atlas_libs = openblas
libraries = openblas

[openblas]
libraries = openblas
library_dirs =  /opt/OpenBLAS/lib
include_dirs =  /opt/OpenBLAS/include

scipy 编译时也需要在其根目录下创建一个同样的文件,可以直接把 numpy 目录下的该文件复制过去。然后可以编译、安装。

cd numpy  # or scipy
pypy3 setup.py build
pypy3 setup.py install

这些编译过程可能需要花几分钟时间。numpy & scipy 安装成功后,其他的常见软件包 matplotlib, jupyter, scikit-learn 等的安装可以直接通过 pip_pypy3.

之后,如果想启动 ipython, 由于环境变量可能不正确,可能要通过以下命令:

pypy3 -m IPython

至此,基于 pypy3 的科学计算 & 机器学习环境安装成功 ~


pypy3 在某些情景下比 cpython 要快,但在我的项目上,它不仅没有变快,反而变慢了。。对于类似于脚本的短时运行的科学计算项目,pypy3 优势可能不明显,也有可能是我的打开方式有什么问题。。

Numpy / Scipy中的卷积计算

Numpy / Scipy中的卷积计算

对我正在进行的一些计算工作进行性能分析,结果表明我程序中的一个瓶颈是基本上实现了此功能的函数(npis numpyspis scipy):

def mix1(signal1, signal2):    spec1 = np.fft.fft(signal1, axis=1)    spec2 = np.fft.fft(signal2, axis=1)    return np.fft.ifft(spec1*spec2, axis=1)

这两个信号的形状为(C,N),其中C是数据集的数量(通常少于20个),并且N是每组样本的数量(大约5000个)。每个集合(行)的计算完全独立于任何其他集合。

我认为这只是一个简单的卷积,因此我尝试将其替换为:

def mix2(signal1, signal2):    outputs = np.empty_like(signal1)    for idx, row in enumerate(outputs):        outputs[idx] = sp.signal.convolve(signal1[idx], signal2[idx], mode=''same'')    return outputs

…只是看看我是否得到了相同的结果。但是我没有,我的问题是:

  1. 为什么不?
  2. 有没有更好的方法来计算的等效值mix1()

(我意识到,mix2可能不会保持原样更快,但是这可能是并行化的一个很好的起点。)

这是我用来快速检查此内容的完整脚本:

import numpy as npimport scipy as spimport scipy.signalN = 4680C = 6def mix1(signal1, signal2):    spec1 = np.fft.fft(signal1, axis=1)    spec2 = np.fft.fft(signal2, axis=1)    return np.fft.ifft(spec1*spec2, axis=1)def mix2(signal1, signal2):    outputs = np.empty_like(signal1)    for idx, row in enumerate(outputs):        outputs[idx] = sp.signal.convolve(signal1[idx], signal2[idx], mode=''same'')    return outputsdef test(num, chans):    sig1 = np.random.randn(chans, num)    sig2 = np.random.randn(chans, num)    res1 = mix1(sig1, sig2)    res2 = mix2(sig1, sig2)    np.testing.assert_almost_equal(res1, res2)if __name__ == "__main__":    np.random.seed(0x1234ABCD)    test(N, C)

答案1

小编典典

因此,我对此进行了测试,现在可以确认以下几点:

1)numpy.convolve不是循环的,这是fft代码为您提供的:

2)FFT在内部没有填充2的幂。比较以下操作的不同速度:

x1 = np.random.uniform(size=2**17-1)x2 = np.random.uniform(size=2**17)np.fft.fft(x1)np.fft.fft(x2)

3)归一化没有区别-如果通过将a(k)* b(ik)加起来进行朴素的圆卷积,您将获得FFT代码的结果。

问题是填充到2的幂会改变答案。我听说过一些故事,有一些方法可以通过巧妙地使用长度的素数来解决这一问题(提到但未在《数字食谱》中进行编码),但我从未见过有人真正这样做过。

我们今天的关于SciPy 和 NumPy 之间的关系scipy与numpy的区别的分享就到这里,谢谢您的阅读,如果想了解更多关于cvxpy 和 numpy 之间的版本冲突:“针对 API 版本 0xe 编译的模块,但此版本的 numpy 是 0xd”、Linux下Python科学计算包numpy和SciPy的安装、macOS 安装 pypy3 + numpy + scipy 实录、Numpy / Scipy中的卷积计算的相关信息,可以在本站进行搜索。

本文标签: