在本文中,我们将带你了解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的区别)
- cvxpy 和 numpy 之间的版本冲突:“针对 API 版本 0xe 编译的模块,但此版本的 numpy 是 0xd”
- Linux下Python科学计算包numpy和SciPy的安装
- macOS 安装 pypy3 + numpy + scipy 实录
- Numpy / Scipy中的卷积计算
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.solve
vs scipy.linalg.solve
。它们是相似的,但后者比前者提供了一些额外的功能。
为什么会出现明显的重复?如果这是numpy
对scipy
命名空间的大规模导入,为什么会有细微的行为差异和缺少的功能?是否有一些总体逻辑可以帮助消除混乱?
[1] numpy.min
、numpy.max
和numpy.abs
其他一些在命名空间中没有对应scipy
项。
[2] 使用 NumPy 1.5.1 和 SciPy 0.9.0rc2 进行测试。
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的安装
系统环境:
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 实录
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中的卷积计算
对我正在进行的一些计算工作进行性能分析,结果表明我程序中的一个瓶颈是基本上实现了此功能的函数(np
is numpy
,sp
is 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
…只是看看我是否得到了相同的结果。但是我没有,我的问题是:
- 为什么不?
- 有没有更好的方法来计算的等效值
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中的卷积计算的相关信息,可以在本站进行搜索。
本文标签: