我有一小部分现有的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参数.
我一直在努力为这类问题找到正确的文档或教程.任何建议都将非常感激.
我正在努力实现以下等式:
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可以表示为对角线密集而不消耗大量内存,这可能会导致非常有效的性能,但我不知道这是否可行.
我感谢您的帮助!
协方差矩阵的特征值应该是实数和非负的,因为协方差矩阵是对称的和半正定的.
但是,请看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) 我不确定我用过的方法是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中有更好的内置解决方案吗?
谢谢!
我需要找到数组中出现的多个最小值的索引.我很熟悉,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.
谢谢!
我想在我的最后添加一个值numpy.array.我看到了numpy.append函数,但它执行原始数组的精确副本,最后添加了我的新值.我想避免复制,因为我的阵列很大.
我正在使用resize方法,然后将最后一个索引设置为新值.你能否确认这resize是最后追加价值的最佳方式?是不是在某处移动记忆?
oldSize = myArray,shape(0)
myArray.resize( oldSize + 1 )
myArray[oldSize] = newValue
Run Code Online (Sandbox Code Playgroud) 我正在使用相当多的fortran库来进行一些数学计算.所以numpy中的所有数组都需要Fortran连续.
目前我用numpy.asfortranarray()完成了这个.
我的问题是:
我需要使用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文件中的逗号.
谢谢.
我有一个符号数组,可以表示为:
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) 假设我有三个任意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)