【问题标题】:Numpy: Setting an array element with a sequenceNumpy:使用序列设置数组元素
【发布时间】:2016-09-14 06:05:06
【问题描述】:

我不确定这段代码我做错了什么:

import cv2
from matplotlib import image as img
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.pyplot import axis

img = cv2.imread('popi.png', 0)
cv2.imshow('lel', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
a = np.shape(img)
iloscpixeli = a[0] * a[1]
print(iloscpixeli)
b = np.zeros((256, 1))
H = np.zeros((a[0], a[1]))
# czest = np.zeros((256, 1))
# probf = np.zeros((256, 1))
# probc = np.zeros((256, 1))
# cum = np.zeros((256, 1))
dim = np.shape(img)
wyjscie = np.zeros(dim)
H = np.zeros(dim)
print("dim", dim)
czest = np.zeros(dim)
probc = np.zeros(dim)
# print("r",czest)
probf = np.zeros(dim)
cum = np.zeros(dim)
for i in range(1, a[0]):
    for j in range(1, a[1]):
        wartosc = img[i, j]
        czest[wartosc + 1] = (czest[wartosc + 1] + 1)
        probf[wartosc + 1] = czest[wartosc + 1] / iloscpixeli

suma = 0
nobins = 255
d = np.zeros((256, 1))
d1 = np.shape(d)
d11 = d1[0]

for i in range(1, d11):
    suma = suma + czest[i]
    cum[i] = suma
    probc[i] = cum[i] / iloscpixeli
    wyjscie[i] = np.around(probc[i] * nobins)
wyjscie=wyjscie.tolist()
for i in range(1, a[0]):
    for j in range(1, a[1]):
        H[i, j] = wyjscie[img[i,j] + 1]

cv2.imshow('wyrownany', H)

还有这一行(是的,最后一个:C):

H[i, j] = wyjscie[img[i,j] + 1] 

给我错误 ValueError: setting an array element with a sequence。尝试修复检查将“wyjscie”从数组更改为列表..但效果不佳。 我寻求任何帮助。查找代码时很棒,可能我做了一些愚蠢的事情......但是有czest[wartosc + 1] = (czest[wartosc + 1] + 1)这行,它运行良好......

【问题讨论】:

  • wyjscie[img[i,j] + 1] 的形状或 len() 是什么?由于H 是2d,H[i,j] 需要一个标量或单项列表或数组。

标签: python arrays numpy


【解决方案1】:
  • H 是一个 numpy 数组,默​​认值为 dtype=float。它的形状是二维的
  • 你想插入wyjscie[img[i,j] + 1]
  • wyjscie 本身是一个 numpy 数组,形状为 2d
  • 您将wyjscie 转换为一个列表,但这个列表将是一个嵌套列表,因为原来的暗淡是2d
  • 您在嵌套列表中进行索引,因此获取一个列表并将此列表放入一个包含浮点数的单元格中 = 将一个序列/列表放入数组元素 错误
  • (你是波兰人:-D)

【讨论】:

  • 是的,我是,我的英语是.. xD 没有评论。 @sascha
  • 我不确定我是否理解得很好,所以我不需要将 wyjscie 转换为列表?我该怎么办?
  • wyjscie 是一个列表,在你将它转换为列表之前。我不知道你在做什么。 .tolist() 之前的步骤,我不喜欢它。但是只有一个进入 wyjscie 的索引,您就可以获得一个列表/序列。因此,您需要第二个索引或完全不同的方法。如果它是用于调试目的的 numpy 数组,我建议定期使用 print(type(X)) 和 print(X.shape)。这会有所帮助!
  • 当我删除 wyjscie.tolist() 时(顺便说一句。波兰语中的 wyjscie 已失效;P)和 print(np.shape(H)) print(np.shape(wyjscie)) print( np.shape(img)) 它给了我合适的尺寸(形状)(H=wyjscie=img).. 所以对我来说它应该可以工作但仍然......
  • wyjscie[img[i,j] + 1] 始终是一维索引 (img[i,j] = number + 1 = number) -> 你总是会得到另一个维度-> 完整的行/列 = 序列。二维索引看起来像:wyjscie[img[i,j] + 1, 5]。但是好吧......我不知道你在做什么:-)。检查形状并查找 numpys 索引规则。
猜你喜欢
  • 2015-12-19
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2018-11-10
  • 2016-01-21
  • 2018-05-09
  • 2017-10-20
  • 1970-01-01
相关资源
最近更新 更多