我有这样一个数组:
A = array([1,2,3,4,5,6,7,8,9,10])
Run Code Online (Sandbox Code Playgroud)
我试图得到这样的数组:
B = array([[1,2,3],
[2,3,4],
[3,4,5],
[4,5,6]])
Run Code Online (Sandbox Code Playgroud)
每行(固定的任意宽度)移动一个.A的数组是10k记录长,我试图在Numpy中找到一种有效的方法.目前我正在使用vstack和一个缓慢的for循环.有更快的方法吗?
编辑:
width = 3 # fixed arbitrary width
length = 10000 # length of A which I wish to use
B = A[0:length + 1]
for i in range (1, length):
B = np.vstack((B, A[i, i + width + 1]))
Run Code Online (Sandbox Code Playgroud) 我最近在这篇文章的答案中学到了大步,并且想知道如何使用它们来比我在本文中提出的更有效地计算移动平均滤波器(使用卷积滤波器).
这就是我到目前为止所拥有的.它接受原始数组的视图然后将其滚动必要的量并将内核值相加以计算平均值.我知道边缘没有正确处理,但我可以在以后处理...有更好更快的方法吗?目标是过滤大到5000x5000 x 16层的大型浮点阵列,这个任务scipy.ndimage.filters.convolve相当慢.
请注意,我正在寻找8邻居连接,即3x3滤镜取9个像素的平均值(焦点像素周围8个),并将该值分配给新图像中的像素.
import numpy, scipy
filtsize = 3
a = numpy.arange(100).reshape((10,10))
b = numpy.lib.stride_tricks.as_strided(a, shape=(a.size,filtsize), strides=(a.itemsize, a.itemsize))
for i in range(0, filtsize-1):
if i > 0:
b += numpy.roll(b, -(pow(filtsize,2)+1)*i, 0)
filtered = (numpy.sum(b, 1) / pow(filtsize,2)).reshape((a.shape[0],a.shape[1]))
scipy.misc.imsave("average.jpg", filtered)
Run Code Online (Sandbox Code Playgroud)
编辑关于我如何看待这个工作的澄清:
当前代码:
我希望的是更好地使用stride_tricks直接获取9个值或内核元素的总和,对于整个数组,或者有人可以说服我另一个更有效的方法......
我有一个2D数组2000x4000,对于该数组中的每个单元,我必须将该单元的值与10个相邻单元(在+/- X和+/- Y中)制作的蒙版的标准偏差进行比较。
例如,这就是我现在正在做的事情:
import numpy as np
from astropy.stats import sigma_clipped_stats
BPmap=[]
N=10
a=np.random.random((2000,4000))
for row in range(N,a.shape[0]-N):
BPmap_row=[]
for column in range(N,a.shape[1]-N):
Bpmap_data=np.array(a[row-N:row+N,column-N:column+N].ravel())
mean, median, std = sigma_clipped_stats(Bpmap_data, sigma=3,iters=5)
BPmap_Nsigma=float(a[row][column]-median)/std
BPmap_row.append(BPmap_Nsigma)
BPmap.append(BPmap_row)
Run Code Online (Sandbox Code Playgroud)
这有一个明显的问题,就是我正在执行2000x4000 = 8000000循环,这花费了很长时间。我需要找到一种非常有效的方法来执行这些操作,但是我不知道如何做。
我正在开发一个需要获得图像方差的项目.目前我正采取两种方法(两种方法都有效,但速度很慢):
这是使用numpy的代码,varianceMatrix是输出
varianceMatrix = np.zeros(im.shape,np.uint8)
w = 1 # the radius of pixels neighbors
ny = len(im)
nx = len(im[0])
for i in range(w,nx-w):
for j in range(w,ny-w):
sampleframe = im[j-w:j+w, i-w:i+w]
variance = np.var(sampleframe)
varianceMatrix[j][i] = int(variance)
return varianceMatrix
Run Code Online (Sandbox Code Playgroud)
这是scipy功能:
from scipy import ndimage
varianceMatrix = ndimage.generic_filter(im, np.var, size = 3)
Run Code Online (Sandbox Code Playgroud)
scipy功能更快,但不是那么多.我正在寻找一种更好的替代方案来计算方差.
有任何想法吗???