相关疑难解决方法(0)

1D阵列的高效Numpy 2D阵列构造

我有这样一个数组:

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)

python numpy

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

使用步幅进行有效的移动平均滤波器

我最近在这篇文章答案中学到了大步,并且想知道如何使用它们来比我在本文中提出的更有效地计算移动平均滤波器(使用卷积滤波器).

这就是我到目前为止所拥有的.它接受原始数组的视图然后将其滚动必要的量并将内核值相加以计算平均值.我知道边缘没有正确处理,但我可以在以后处理...有更好更快的方法吗?目标是过滤大到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)

编辑关于我如何看待这个工作的澄清:

当前代码:

  1. 使用stride_tricks生成一个类似[[0,1,2],[1,2,3],[2,3,4] ...]的数组,它对应于过滤器内核的顶行.
  2. 沿垂直轴滚动以获得内核[[10,11,12],[11,12,13],[13,14,15] ...]的中间行并将其添加到我得到的数组中1)
  3. 重复以获得内核的最后一行[[20,21,22],[21,22,23],[22,23,24] ...].此时,我取每行的总和除以滤波器中的元素数量,给出每个像素的平均值,(移动1行和1列,边缘有一些奇怪,但我可以稍后再照顾).

我希望的是更好地使用stride_tricks直接获取9个值或内核元素的总和,对于整个数组,或者有人可以说服我另一个更有效的方法......

python numpy image-processing filter

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

循环遍历2D数组的有效方法

我有一个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循环,这花费了很长时间。我需要找到一种非常有效的方法来执行这些操作,但是我不知道如何做。

python python-3.x

11
推荐指数
2
解决办法
440
查看次数

有效地计算图像蟒蛇的方差

我正在开发一个需要获得图像方差的项目.目前我正采取两种方法(两种方法都有效,但速度很慢):

  1. 分别计算每个像素的方差:

这是使用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)
  1. 使用现有的scipy函数:

这是scipy功能:

from scipy import ndimage

varianceMatrix = ndimage.generic_filter(im, np.var, size = 3)
Run Code Online (Sandbox Code Playgroud)

scipy功能更快,但不是那么多.我正在寻找一种更好的替代方案来计算方差.

有任何想法吗???

python numpy image variance scipy

8
推荐指数
2
解决办法
4188
查看次数

标签 统计

python ×4

numpy ×3

filter ×1

image ×1

image-processing ×1

python-3.x ×1

scipy ×1

variance ×1