小编Sau*_*tro的帖子

将Numpy数组传递给用Cython包装的C代码

我有一小部分现有的C代码,我想用Cython包装.我希望能够设置一些numpy数组,然后将这些数组作为参数传递给C代码,其代码的函数采用标准的c数组(1d和2d).在弄清楚如何编写正确的.pyx代码以正确处理事情方面,我有点陷入困境.

有一些函数,但文件funcs.h中的典型函数类似于:

double InnerProduct(double *A, double **coords1, double **coords2, const int len)
Run Code Online (Sandbox Code Playgroud)

然后我有一个.pyx文件,其中包含相应的行:

cdef extern from "funcs.h":
    double InnerProduct(double *A, double **coords1, double **coords2, int len)
Run Code Online (Sandbox Code Playgroud)

我摆脱了const,因为cython不支持它.我陷入困境的是包装器代码应该看起来像是将MxN numpy数组传递给**coords1和**coords2参数.

我一直在努力为这类问题找到正确的文档或教程.任何建议都将非常感激.

arrays numpy cython

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

有效地乘以Numpy/Scipy稀疏矩阵和密集矩阵

我正在努力实现以下等式:

X =(Y.T * Y + Y.T * C * Y) ^ -1
Run Code Online (Sandbox Code Playgroud)

Y是(nxf)矩阵,C是(nxn)对角线; n约为300k,f在100到200之间变化.作为优化过程的一部分,这个等式将使用近1亿次,因此必须非常快速地处理.

Y是随机初始化的,C是一个非常稀疏的矩阵,对角线上300k中只有少数数字与0不同.由于Numpy的对角线函数创建了密集矩阵,我创建了C作为稀疏csr矩阵.但是当试图解决方程式的第一部分时:

r = dot(C, Y)
Run Code Online (Sandbox Code Playgroud)

由于内存限制,计算机崩溃.我决定然后尝试将Y转换为csr_matrix并进行相同的操作:

r = dot(C, Ysparse)
Run Code Online (Sandbox Code Playgroud)

这种方法耗时1.38毫秒.但是这个解决方案有点"棘手",因为我使用稀疏矩阵来存储密集的矩阵,我想知道它真的有多高效.

所以我的问题是,是否有一些方法可以将稀疏的C和密集的Y相乘,而不必将Y变为稀疏并提高性能?如果不知何故C可以表示为对角线密集而不消耗大量内存,这可能会导致非常有效的性能,但我不知道这是否可行.

我感谢您的帮助!

python performance numpy scipy sparse-matrix

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

scipy.linalg.eig返回协方差矩阵的复特征值?

协方差矩阵的特征值应该是实数和非负的,因为协方差矩阵是对称的和半正定的.

但是,请看scipy的以下实验:

>>> a=np.random.random(5)
>>> b=np.random.random(5)
>>> ab = np.vstack((a,b)).T
>>> C=np.cov(ab)
>>> eig(C)
7.90174997e-01 +0.00000000e+00j,
2.38344473e-17 +6.15983679e-17j,
2.38344473e-17 -6.15983679e-17j,
-1.76100435e-17 +0.00000000e+00j,   
5.42658040e-33 +0.00000000e+00j
Run Code Online (Sandbox Code Playgroud)

但是,在Matlab中重现上面的例子可以正常工作:

a = [0.6271, 0.4314, 0.3453, 0.8073, 0.9739]
b = [0.1924, 0.3680, 0.0568, 0.1831, 0.0176]
C=cov([a;b])
eig(C)
-0.0000
-0.0000
 0.0000
 0.0000
 0.7902
Run Code Online (Sandbox Code Playgroud)

python matlab numpy linear-algebra scipy

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

将SymPy矩阵转换为numpy数组/矩阵的最佳方法是什么?

我不确定我用过的方法是sympy将a转换MutableDenseMatrix为a numpy.array还是numpy.matrix当前的好习惯.

我有一个符号矩阵,如:

g = sympy.Matrix( [[   x,  2*x,  3*x,  4*x,  5*x,  6*x,  7*x,  8*x,   9*x,  10*x]
                   [x**2, x**3, x**4, x**5, x**6, x**7, x**8, x**9, x**10, x**11]] )
Run Code Online (Sandbox Code Playgroud)

我正在转变为numpy.array:

g_func = lambda val: numpy.array( g.subs( {x:val} ).tolist(), dtype=float )
Run Code Online (Sandbox Code Playgroud)

我得到一个给定值的数组x.

SymPy中有更好的内置解决方案吗?

谢谢!

python arrays numpy matrix sympy

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

在Python中查找给定数组中的最小值索引

我需要找到数组中出现的多个最小值的索引.我很熟悉,np.argmin但它给了我一个数组中第一个最小值的索引.例如.

a = np.array([1,2,3,4,5,1,6,1])    
print np.argmin(a)
Run Code Online (Sandbox Code Playgroud)

这给了我0,而不是我期待的,0,5,7.

谢谢!

python arrays numpy

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

追加与调整numpy数组的大小

我想在我的最后添加一个值numpy.array.我看到了numpy.append函数,但它执行原始数组的精确副本,最后添加了我的新值.我想避免复制,因为我的阵列很大.

我正在使用resize方法,然后将最后一个索引设置为新值.你能否确认这resize是最后追加价值的最佳方式?是不是在某处移动记忆?

oldSize = myArray,shape(0)
myArray.resize( oldSize + 1 )
myArray[oldSize] = newValue
Run Code Online (Sandbox Code Playgroud)

python arrays numpy

14
推荐指数
1
解决办法
4507
查看次数

如何强制numpy数组顺序为fortran风格?

我正在使用相当多的fortran库来进行一些数学计算.所以numpy中的所有数组都需要Fortran连续.
目前我用numpy.asfortranarray()完成了这个.

我的问题是:

  1. 这是一个告诉numpy的快速方法,数组应该以fortran风格存储还是更快?
  2. 是否有可能设置一些numpy标志,以便创建的每个数组都是fortran风格?

python arrays performance fortran numpy

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

Python,转置列表并写入CSV文件

我需要使用python写入csv文件,每个迭代器项应该以新行开头.所以我使用的分隔符是"\n".写完每个列表后,下一个列表应该从下一个单元格写入.如下:

 lol = [[1,2,3],[4,5,6]]
Run Code Online (Sandbox Code Playgroud)

csv将如下:

1 4
2 5
3 6
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

file = open("test.csv", "wb")
fileWriter = csv.writer(file , delimiter='\n',quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamWriter.writerow([1,2,3])
spamWriter = csv.writer(file , delimiter=',',quotechar='|', quoting=csv.QUOTE_MINIMAL)
spamWriter.writerow([4,5,6])
file.close()
Run Code Online (Sandbox Code Playgroud)

结果如下:

 1
 2
 3
 4 5 6
Run Code Online (Sandbox Code Playgroud)

使用csv模块如何获得如下输出:

 1 4 
 2 5
 3 6
Run Code Online (Sandbox Code Playgroud)

这里的空格表示csv文件中的逗号.

谢谢.

python csv list

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

使用SciPy集成返回矩阵或数组的函数

我有一个符号数组,可以表示为:

from sympy import lambdify, Matrix

g_sympy = Matrix([[   x,  2*x,  3*x,  4*x,  5*x,  6*x,  7*x,  8*x,   9*x,  10*x],
                  [x**2, x**3, x**4, x**5, x**6, x**7, x**8, x**9, x**10, x**11]])

g = lambdify( (x), g_sympy )
Run Code Online (Sandbox Code Playgroud)

所以每个x我得到一个不同的矩阵:

g(1.) # matrix([[  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.],
      #         [  1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.,   1.]])
g(2.) # matrix([[  2.00e+00,   4.00e+00,   6.00e+00,   8.00e+00,   1.00e+01, 1.20e+01,   1.40e+01,   1.60e+01,   1.80e+01,   2.00e+01],
      #         [  4.00e+00,   8.00e+00, …
Run Code Online (Sandbox Code Playgroud)

python numpy matrix scipy numerical-integration

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

从三个1D阵列创建一个numpy 3D坐标数组

假设我有三个任意1D数组,例如:

x_p = np.array((1.0, 2.0, 3.0, 4.0, 5.0))
y_p = np.array((2.0, 3.0, 4.0))
z_p = np.array((8.0, 9.0))
Run Code Online (Sandbox Code Playgroud)

这三个数组表示3D网格中的采样间隔,我想为所有交叉点构建三维向量的一维数组,类似于

points = np.array([[1.0, 2.0, 8.0],
                   [1.0, 2.0, 9.0],
                   [1.0, 3.0, 8.0],
                   ...
                   [5.0, 4.0, 9.0]])
Run Code Online (Sandbox Code Playgroud)

订单实际上并不重要.生成它们的明显方法:

npoints = len(x_p) * len(y_p) * len(z_p)
points = np.zeros((npoints, 3))
i = 0
for x in x_p:
    for y in y_p:
        for z in z_p:
            points[i, :] = (x, y, z)
            i += 1
Run Code Online (Sandbox Code Playgroud)

所以问题是......有更快的方法吗?我看了但没找到(可能只是找不到合适的Google关键字).

我目前正在使用这个:

npoints = len(x_p) * len(y_p) * len(z_p)
points = …
Run Code Online (Sandbox Code Playgroud)

python arrays performance numpy

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