我一直在玩numba和numexpr试图加速一个简单的元素矩阵乘法.我无法获得更好的结果,它们基本上(速度方向)等同于numpys乘法函数.这个地区有人有运气吗?我使用numba和numexpr是错误的(我对此很新)或者这是一个不好的方法来尝试加快速度.这是一个可重现的代码,谢谢你的高级:
import numpy as np
from numba import autojit
import numexpr as ne
a=np.random.rand(10,5000000)
# numpy
multiplication1 = np.multiply(a,a)
# numba
def multiplix(X,Y):
M = X.shape[0]
N = X.shape[1]
D = np.empty((M, N), dtype=np.float)
for i in range(M):
for j in range(N):
D[i,j] = X[i, j] * Y[i, j]
return D
mul = autojit(multiplix)
multiplication2 = mul(a,a)
# numexpr
def numexprmult(X,Y):
M = X.shape[0]
N = X.shape[1]
return ne.evaluate("X * Y")
multiplication3 = numexprmult(a,a)
Run Code Online (Sandbox Code Playgroud) 目前,我正在使用h5py生成hdf5数据集.我有类似的东西
import h5py
import numpy as np
my_data=np.genfromtxt("/tmp/data.csv",delimiter=",",dtype=None,names=True)
myFile="/tmp/f.hdf"
with h5py.File(myFile,"a") as f:
dset = f.create_dataset('%s/%s'%(vendor,dataSet),data=my_data,compression="gzip",compression_opts=9)
Run Code Online (Sandbox Code Playgroud)
这适用于相对较大的ASCII文件(400MB).我想对更大的数据集(40GB)做同样的事情.使用h5py有更好或更有效的方法吗?我想避免将整个数据集加载到内存中.
有关数据的一些信息:
dtype=None从np.loadtxt()我正在使用Mayavi渲染一些由3D体积内的多个2D平面组成的成像数据,其位置,方向和比例由4x4刚体仿射变换矩阵定义.每架飞机包括:
mayavi.mlab.imshowmayavi.mlab.points3d和mayavi.mlab.plot3d分别.我通过用我的仿射矩阵点击它们的坐标,将我的点和线顶点从2D参考平面转换为3D空间.基于我刚才的问题/答案在这里,我想通了,我可以设置的位置和方向ImageActor个别对象,使用:
obj = mlab.imshow(img)
obj.actor.orientation = [pitch, roll, yaw] # the required orientation (deg)
obj.actor.position = [dx, dy, dz] # the required position
obj.actor.scale = [sx, sy, sz] # the required scale
Run Code Online (Sandbox Code Playgroud)
现在情节看起来像这样:

所有东西都很好地排列,但是很难解释,因为这些平面的间距非常密集.我现在希望能够做的是通过一些比例因子"拉伸"z轴.在点和线的情况下,这很容易做到 - 我所做的就是将所有变换后的z坐标乘以比例因子.
但是,我无法弄清楚如何将相同的变换应用于图像.如果我只是缩放z位置,那么图像的旋转和缩放当然是错误的,并且我绘制的点/线将不再与图像位于同一平面上:

我需要做的是应用一个非刚性仿射变换,它包含剪切以及旋转,平移和缩放到我的图像.
有没有什么方法可以手动应用剪切ImageActor,甚至更好的只是直接应用我预先计算的任意4x4仿射矩阵?
我正在学习的手册(我是新手)说:
"差异小于机器epsilon的数字在数值上是相同的"
使用Python,可以通过键入获得浮动值的机器epsilon
eps = numpy.finfo(float).eps
Run Code Online (Sandbox Code Playgroud)
现在,如果我检查
1 + eps/10 != 1
Run Code Online (Sandbox Code Playgroud)
我获得了假.
但是,如果我检查
0.1 + eps/10 != 0.1
Run Code Online (Sandbox Code Playgroud)
我获得了真实.
如果我将eps除以100,我后面的逻辑表达式将变为False.那么,机器epsilon如何工作?Python文档只是说
"最小的可表示正数,使得1.0 + eps!= 1.0.eps类型是一种合适的浮点类型."
先感谢您.
我有一个代码将一个numpy数组切成一个圆圈.我希望仅从圆圈中恢复包含在特定角度范围内的值并掩盖数组.例如:屏蔽原始数组,其中(x,y)位置包含在圆圈的0到45度之间.
有这样做的pythonic方式吗?
这是我的(简化)原始代码:
import numpy as np
matrix = np.zeros((500,500))
x = 240
y = 280
radius = 10
mask=np.ogrid[x-radius:x+radius+1,y-radius:y+radius+1]
matrix[mask]
Run Code Online (Sandbox Code Playgroud)
提前致谢
编辑:我省略了半径可以变化.
有谁知道如何从python中的一个非常大的稀疏矩阵计算相关矩阵?基本上,我正在寻找类似于numpy.corrcoefscipy稀疏矩阵的东西.
使用numpy.interp我能够计算一维分段线性插值到具有离散数据点的给定值的函数.
这是一个类似的函数来返回对数插值吗?
我有一个二维numpy数组,列数和行数相同.我想把它们安排成一个更大的阵列,在对角线上有较小的阵列.应该可以指定起始矩阵在对角线上的频率.例如:
a = numpy.array([[5, 7],
[6, 3]])
Run Code Online (Sandbox Code Playgroud)
所以,如果我想在对角线上对这个数组进行2次,那么所需的输出将是:
array([[5, 7, 0, 0],
[6, 3, 0, 0],
[0, 0, 5, 7],
[0, 0, 6, 3]])
Run Code Online (Sandbox Code Playgroud)
三次:
array([[5, 7, 0, 0, 0, 0],
[6, 3, 0, 0, 0, 0],
[0, 0, 5, 7, 0, 0],
[0, 0, 6, 3, 0, 0],
[0, 0, 0, 0, 5, 7],
[0, 0, 0, 0, 6, 3]])
Run Code Online (Sandbox Code Playgroud)
有没有一种快速的方法来实现这个与numpy方法和任意大小的起始数组(仍然考虑起始数组具有相同数量的行和列)?
我喜欢使用np.fromiter,numpy因为它是一种构建np.array对象的资源惰性方式.但是,它似乎不支持多维数组,这些数组也非常有用.
import numpy as np
def fun(i):
""" A function returning 4 values of the same type.
"""
return tuple(4*i + j for j in range(4))
# Trying to create a 2-dimensional array from it:
a = np.fromiter((fun(i) for i in range(5)), '4i', 5) # fails
# This function only seems to work for 1D array, trying then:
a = np.fromiter((fun(i) for i in range(5)),
[('', 'i'), ('', 'i'), ('', 'i'), ('', 'i')], 5) …Run Code Online (Sandbox Code Playgroud) python ×9
numpy ×8
arrays ×2
angle ×1
correlation ×1
h5py ×1
hdf5 ×1
matrix ×1
mayavi ×1
memory-leaks ×1
numba ×1
objgraph ×1
performance ×1
precision ×1
python-2.7 ×1
scipy ×1