Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从行中的所有值中减去每行第一个和最后一个值的平均值_Python_Arrays_List_Numpy_For Loop - Fatal编程技术网

Python 从行中的所有值中减去每行第一个和最后一个值的平均值

Python 从行中的所有值中减去每行第一个和最后一个值的平均值,python,arrays,list,numpy,for-loop,Python,Arrays,List,Numpy,For Loop,我有一个numpy数组,看起来像这样: 77.132 2.075 63.365 74.880 49.851 22.480 19.806 76.053 16.911 8.834 68.536 95.339 0.395 51.219 81.262 61.253 72.176 29.188 91.777 71.458 54.254 14.217 37.334 67.413 44.183 43.401 61.777 51.314 65.040 60.10

我有一个numpy数组,看起来像这样:

77.132  2.075   63.365  74.880
49.851  22.480  19.806  76.053
16.911  8.834   68.536  95.339
0.395   51.219  81.262  61.253
72.176  29.188  91.777  71.458
54.254  14.217  37.334  67.413
44.183  43.401  61.777  51.314
65.040  60.104  80.522  52.165
90.865  31.924  9.046   30.070
11.398  82.868  4.690   62.629
我想做的是

  • 查找每行中第一项和最后一项的平均值
  • 从该行的每个像素中减去该平均值
  • 每行重复一次
  • 创建减去像素的新图像
我曾尝试使用
进行
循环,但无法使其正常工作:

import numpy as np

#   Create random arrays to simulate images
np.random.seed(10)
image = 100 * np.random.rand(10, 4)

no_disk_list = []

#for row in image:
#    left, right =   row[0], row[-1]
#    average = (left + right) / 2.0
#    for i in row:
#        no_average = row[i] - average
#        print(average)
#        no_disk_list.append(no_average)

subtracted = np.ones_like(image)
height, width = image.shape
for row in image:
    left, right =   image[0], image[-1]
    average = (left + right) / 2.0
    for element in row:
        subtracted[row, element] = image[row, element] - average
两个嵌套循环都会出现错误:

  File "C:/Users/Jeremy/Dropbox/Astro480/NEOWISE/subtract_disk.py", line 17, in <module>
    no_disk_value = row[i] - disk_value

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices
文件“C:/Users/Jeremy/Dropbox/Astro480/NEOWISE/subtract_disk.py”,第17行,在
无磁盘值=行[i]-磁盘值
索引器错误:只有整数、片(`:`)、省略号(`…`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引
对于第一个循环和

  File "C:/Users/Jeremy/Dropbox/Astro480/NEOWISE/subtract_pixels.py", line 23, in <module>
    print(image[row, element])

IndexError: arrays used as indices must be of integer (or boolean) type
文件“C:/Users/Jeremy/Dropbox/Astro480/NEOWISE/subtract_pixels.py”,第23行,在
打印(图像[行,元素])
索引器错误:用作索引的数组必须是整数(或布尔)类型

第二次。这些问题在我的情况下用处有限。此外,我知道矢量化是一种更好的方法,因为我最终使用的图像有130万像素。如何使循环工作,或者更好地使计算矢量化?

如果我正确理解问题,这将起作用:

subtracted = np.ones_like(image)
height, width = image.shape
for row_no, row in enumerate(image):   # keep the row number using enumerate
    left, right = row[0], row[-1]      # you need the first and last value of the ROW!
    average = (left + right) / 2.0
    # Also use enumerate in the inner loop
    for col_no, element in enumerate(row):
        subtracted[row_no, col_no] = element - average
您甚至可以使用广播(“矢量化”)来大大缩短这一时间:

subtracted = image - (image[:, [0]] + image[:, [-1]]) / 2
image[:,[0]]
是第一列,
image[:,[-1]]
是最后一列。通过将它们相加并除以2,可以得到一个包含每行平均值的2D数组。最后一步是从图像中减去它,这在本例中很容易,因为它将正确广播

逐步:

>>> arr = np.arange(20).reshape(4, 5)
>>> arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
>>> arr[:, [0]]  # first column
array([[ 0],
       [ 5],
       [10],
       [15]])
>>> arr[:, [-1]]  # last column
array([[ 4],
       [ 9],
       [14],
       [19]])
>>> (arr[:, [0]] + arr[:, [-1]]) / 2   # average
array([[  2.],
       [  7.],
       [ 12.],
       [ 17.]])
>>> arr - (arr[:, [0]] + arr[:, [-1]]) / 2  # subtracted
array([[-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.],
       [-2., -1.,  0.,  1.,  2.]])

因此,
广播
矢量化的一个特殊例子吗?是和否:。这是一种将运算矢量化的技术(是的,加法、除法和减法都是矢量化的)。