小编Sau*_*tro的帖子

为什么numpy比数字化示例上的matlab慢得多?

我正在比较numpy和matlab的性能,在一些情况下我观察到numpy明显变慢(索引,对数组的简单操作,如绝对值,乘法,求和等).让我们看看下面的例子,它以某种方式引人注目,涉及函数digitize(我打算用它来同步时间戳):

import numpy as np
import time
scale=np.arange(1,1e+6+1)
y=np.arange(1,1e+6+1,10)
t1=time.time()
ind=np.digitize(scale,y)
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1)
Run Code Online (Sandbox Code Playgroud)

结果是:

时间过去了55.91秒

现在让我们使用等效函数histc尝试相同的Matlab 示例

scale=[1:1e+6];
y=[1:10:1e+6];
tic
[N,bin]=histc(scale,y);
t=toc;
display(['Time passed is ',num2str(t), ' seconds'])
Run Code Online (Sandbox Code Playgroud)

结果是:

时间过去了0.10237秒

要快560倍!

当我学习使用C++扩展Python时,我实现了自己的数字化版本(使用扩展库的boost库):

import analysis # my C++ module implementing digitize
t1=time.time()
ind2=analysis.digitize(scale,y)
t2=time.time()
print 'Time passed is %2.2f seconds' %(t2-t1)
np.all(ind==ind2) #ok
Run Code Online (Sandbox Code Playgroud)

结果是:

时间过去了0.02秒

因为我的数字化版本假设输入都是单调的,所以有一点作弊,这可能解释为什么它比Matlab更快.但是,对大小为1e + 6的数组进行排序需要0.16秒(使用numpy.sort),因此与Matlab函数histc相比,我的函数性能更差(约1.6倍).

所以问题是:

  • 为什么numpy.digitize这么慢?这个函数不应该用编译和优化的代码编写吗?
  • 为什么我自己的数字化版本比numpy.digitize快得多,但仍然比Matlab慢(我相信我使用最快的算法,假设我假设输入已经排序)?

我正在使用Fedora 16,我最近安装了ATLAS和LAPACK库(但性能已发生了很大变化).我是否应该重建numpy?我不确定我的numpy安装是否使用适当的库来获得最大速度,也许Matlab正在使用更好的库. …

python performance matlab numpy

14
推荐指数
2
解决办法
4054
查看次数

以编程方式将列名添加到numpy ndarray

我正在尝试将列名添加到numpy ndarray中,然后按名称选择列.但它不起作用.当我添加名称时,或者稍后当我尝试调用它们时,我无法判断问题是否发生.

这是我的代码.

data = np.genfromtxt(csv_file, delimiter=',', dtype=np.float, skip_header=1)

#Add headers
csv_names = [ s.strip('"') for s in file(csv_file,'r').readline().strip().split(',')]
data = data.astype(np.dtype( [(n, 'float64') for n in csv_names] ))
Run Code Online (Sandbox Code Playgroud)

基于维度的诊断符合我的预期:

print len(csv_names)
>> 108
print data.shape
>> (1652, 108)
Run Code Online (Sandbox Code Playgroud)

"print data.dtype.names"也返回预期的输出.

但是当我开始按字段名称调用列时,就会发生棘手的事情."列"仍然是一个包含108列的数组......

print data["EDUC"].shape
>> (1652, 108)
Run Code Online (Sandbox Code Playgroud)

...它似乎包含比数据集中的行更多的缺失值.

print np.sum(np.isnan(data["EDUC"]))
>> 27976
Run Code Online (Sandbox Code Playgroud)

知道这里出了什么问题吗?添加标题应该是一个简单的操作,但我已经打了几个小时这个bug.救命!

python arrays numpy multidimensional-array

13
推荐指数
1
解决办法
1万
查看次数

Networkx:pagerank,pagerank_numpy和pagerank_scipy之间的区别?

有谁知道Networkx中三种不同的pagerank功能之间的准确性差异?

我有一个1000个节点和139732个边缘的图形,"普通" pagerank函数似乎根本不起作用 - 除了两个节点之外都有相同的PG,所以我假设这个函数不起作用以及大型图表?

pagerank_numpy价值观似乎也比pagerank_scipy价值观更加分散.该函数的文档说"这对于小图表来说是最快和最准确的".什么是"小"图?

另外,为什么pagerank_numpy不允许max_itertol参数?

python numpy pagerank scipy networkx

13
推荐指数
1
解决办法
4605
查看次数

是否可以np.concatenate内存映射文件?

我用np.save()保存了几个numpy数组,并且放在一起它们非常庞大.

是否有可能将它们全部作为内存映射文件加载,然后连接并切换所有这些文件而不将任何内容加载到内存中?

python arrays numpy memory-mapped-files

13
推荐指数
2
解决办法
4253
查看次数

重塑熊猫系列?

它看起来像pandas.Series中的一个错误.

a = pd.Series([1,2,3,4])
b = a.reshape(2,2)
b
Run Code Online (Sandbox Code Playgroud)

b有类型Series但不能显示,最后一个语句给出异常,非常冗长,最后一行是"TypeError:%d format:需要一个数字,而不是numpy.ndarray".b.shape返回(2,2),这与其类型系列相矛盾.我猜也许pandas.Series没有实现重塑功能,我从np.array调用版本?任何人都看到这个错误?我在大熊猫0.9.1.

python numpy reshape pandas

13
推荐指数
1
解决办法
4万
查看次数

如何对SciPy曲线拟合施加约束?

我试图用自定义概率密度函数拟合一些实验值的分布.显然,所得到的函数的积分应该总是等于1,但简单scipy.optimize.curve_fit(功能,dataBincenters,dataCounts)的结果从未满足该条件.解决这个问题的最佳方法是什么?

python optimization curve-fitting scipy

13
推荐指数
2
解决办法
1万
查看次数

从元组中的点集创建散点图

我在元组中有一组点,如下所示:

>>> s
set([(209, 147),
     (220, 177),
     (222, 181),
     (225, 185),
     (288, 173),
     (211, 155),
     (222, 182)])
Run Code Online (Sandbox Code Playgroud)

做这套散点图的正确方法是什么?

python matplotlib set

13
推荐指数
1
解决办法
2万
查看次数

使用numpy在python中执行varimax旋转

我正在研究矩阵的主成分分析.我已经找到了如下所示的组件矩阵

A = np.array([[-0.73465832 -0.24819766 -0.32045055]
              [-0.3728976   0.58628043 -0.63433607]
              [-0.72617152  0.53812819 -0.22846634]
              [ 0.34042864 -0.08063226 -0.80064174]
              [ 0.8804307   0.17166265  0.04381426]
              [-0.66313032  0.54576874  0.37964986]
              [ 0.286712    0.68305196  0.21769803]
              [ 0.94651412  0.14986739 -0.06825887]
              [ 0.40699665  0.73202276 -0.08462949]])
Run Code Online (Sandbox Code Playgroud)

我需要在此组件矩阵中执行varimax旋转,但无法找到旋转的确切方法和程度.大多数示例都显示在R.但是我需要python中的方法.

python arrays numpy

13
推荐指数
3
解决办法
6940
查看次数

将2D numpy数组转换为2D numpy矩阵

我有一个python代码,我必须将2D数组转换为2D矩阵,以便我可以使用它来计算逆.因为我使用numpy.matrix(数组),但它无法正常工作.任何人都可以告诉如何将2D数组转换为numpy矩阵?该数组由所有浮点数组成

python arrays numpy matrix

12
推荐指数
1
解决办法
5万
查看次数

matplotlib等高线图:对数色标的比例色条水平

是否可以在对数刻度中设置颜色条的级别,如下图所示?

在此输入图像描述

以下是可以实现的示例代码:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LogNorm
delta = 0.025

x = y = np.arange(0, 3.01, delta)
X, Y = np.meshgrid(x, y)
Z1 = plt.mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0)
Z2 = plt.mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1)
Z = 1e6 * (Z1* Z2)

fig=plt.figure()
ax1 = fig.add_subplot(111)
lvls = np.logspace(0,4,20)
CF = ax1.contourf(X,Y,Z,
         norm = LogNorm(),
         levels = lvls
        )
CS = ax1.contour(X,Y,Z,
         norm = LogNorm(),
         colors = 'k',
         levels = lvls …
Run Code Online (Sandbox Code Playgroud)

python numpy matplotlib contour colorbar

12
推荐指数
1
解决办法
1万
查看次数