对于numpy ndarray,没有append和insert,就像原生python列表一样。
a = np.array([1, 2, 3])
a.append(5) # this does not work
a = np.append(a, 5) # this is the only way
而对于本地python列表,
a = [1, 2, 3]
a.append(4) # this modifies a
a # [1, 2, 3, 4]
为什么numpy ndarray被设计成这样?我正在写ndarray的一个子类,有没有办法像原生python数组一样实现"append“
我一直被告知python的本机追加是一个缓慢的函数,应该在for循环中避免。然而,经过几次小测试之后,我发现在使用for循环迭代它时,它的性能比numpy数组要差得多:
第一次测试数组/列表构造
附加python本机列表
def pythonAppend(n):
x = []
for i in range(n):
x.append(i)
return x
%timeit pythonAppend(1000000)
Numpy分配数组然后访问
def numpyConstruct(n):
x = np.zeros(n)
我要计算两个量A和B的乘积,然后计算乘积F。一般来说,A和B是数很大的矩阵,所以这种运算是传统的矩阵乘法。让我们把简单性A和B当作标量来考虑。我测试过的所有方法的Python代码如下:
from __future__ import division
import numpy as np
from sympy import Matrix
from sympy import *
A = 2251875000001
B = 28839630
F = 33232924804801
#Method 1: pure Python
C1 = (A*B) % F
A_mat = np.matrix(A
我正在为机器学习处理非常高维的向量,并在考虑使用numpy来减少内存使用量。我运行了一个快速测试,看看我可以使用numpy (1)(3)节省多少内存:
标准表
import random
random.seed(0)
vector = [random.random() for i in xrange(2**27)]
Numpy阵列
import numpy
import random
random.seed(0)
vector = numpy.fromiter((random.random() for i in xrange(2**27)), dtype=float)
内存使用(2)
Nump
假设有几个函数被多次调用。这些函数在3d向量( 1x3数组)上执行乘法、除法、加法等操作。
给定:
import numpy as np
import math
x = [0,1,2]
y = [3,2,1]
a = 1.2
根据我的测试,python数学库执行以下操作的速度更快:
math.sin(a)
而不是让numpy去做:
np.sin(a)
此外,使用python时,像标准化这样的简单算法比使用中讨论的方法的np.linalg.norm更快。
现在如果我们给数据增加一点复杂性,比如对3d进行矩阵乘法,我们有一个3x3的旋转矩阵,然后乘以另一个矩阵并转置,numpy开始获得优势。
目前
我正在尝试用Cython来加速我的Python代码,到目前为止,它工作得很好。然而,我有一个问题:处理列表。
使用cython -a myscript.pyx,我可以看到,在处理列表时,我的代码中只有一部分调用Python例程。
例如,我有一个numpy数组(sel1),需要像这样拆分:
x1 = numpy.array([t[0] for t in sel1])
y1 = numpy.array([t[1] for t in sel1])
z1 = numpy.array([t[2] for t in sel1])
我不知道如何用Cython来加速这个过程。
另一种情况是在使用列表/数组索引
在python中,我有一个名为a的numpy.ndarray和一个名为b的索引列表。我想得到一个列表,列出所有不在b索引周围-10..10位内的a的值。这是我当前的代码,由于数据的分配(a非常大),它需要很多时间才能运行:
aa=a
# Remove all ranges backwards
for bb in b[::-1]:
aa=np.delete(aa, range(bb-10,bb+10))
有没有更有效的方法呢?优选地,具有很少的存储器分配。
我正在解决一个问题,在这个问题中,我需要一个零的列表,然后我必须更新列表中的一些值。现在,我有两个选择,我怎么做,首先是简单地列一个零,然后更新的值,或者我创建一个字典,然后我更新的值。
列表方法:
l=[0]*n
字典法:
d={}
for i in range(n):
d[i]=0
现在构建字典的复杂性是O(n),然后更新键是O(1)。但我不知道python是如何使用上述方法构建零列表的。
让我们假设n是一个很大的数字,上面的方法哪一个更适合这个任务?列表方法是如何在python中实现的?另外,为什么上面的列表方法比创建零列表的列表理解方法要快呢?
我有一个用于无线电信号的巨大数据集(),其组织如下:
dataset是一个包含3个键(X、Y、Z)的.hdf5文件。
X:形状(2555904x1024x2)浮标over 2 Millions sample each has 1024 complex points (2 floats for real and imaginary parts)
Y:形状(2 555 904 X24)整型指向调制类型
Z:形状(2555904x1)整数信号噪声级(信噪比)
我将调制类型和信噪比组织为一个元组((mod,snr),(mod,snr),(mod,snr), ...)列表。
我的问题
我有一个一维numpy数组(array_)和一个Python列表(list_)。
下面的代码可以工作,但效率很低,因为切片涉及不必要的复制(当然对于Python列表,我相信也适用于numpy数组?):
result = sum(array_[1:])
result = sum(list_[1:])
重写它的好方法是什么?
我刚刚开始使用Numpy,并注意到遍历Numpy数组中的每个元素比使用列表列表进行迭代要慢大约4倍。我现在知道这违背了Numpy的目的,如果可能的话,我应该向量化这个函数。我的问题是为什么它的速度要慢4倍。这似乎是一个相当大的数额。
我使用%timeit运行了下面的测试
import numpy as np
b = np.eye(1000)
a = b.tolist()
%timeit b[100][100] #1000000 loops, best of 3: 692 ns per loop
%timeit a[100][100] #10000000 loops, best of 3: 7
我正在为学校做一项作业,我应该给集成函数的python实现和numpy实现计时。我通常期望numpy比python实现执行得更好,但事实并非如此。与numpy数组相比,我在python中使用列表理解的速度大约是4倍。从N=1000到N=100 000都是如此。我没有测试任何更高的东西,因为N=100 000是我需要达到的位置,才能在我的估计中获得可接受的误差。
常规python代码:
f is the function being integrated, a and b are limits and N is number of points to integrate over
def in