访问数组中的元素Python
这是我第一次处理多维数组,并且在访问元素时遇到问题。我试图获取图片的红色像素,但只是数组中的前8个元素。这里是代码访问数组中的元素Python
import Image
import numpy as np
im = Image.open("C:\Users\Jones\Pictures\1.jpg")
pix = im.load()
r, g, b = np.array(im).T
print r[0:8]
由于您处理图像,r
是一个二维数组。为了让图像中的第8个像素,尽量
r.flatten()[:8]
这将自动环绕如果第一行具有小于8个像素。
你好你能帮我第二部分请 – 2013-02-17 05:07:29
请发表一个新问题。 – nneonneo 2013-02-17 05:30:04
好的我添加了另一个问题喜欢你问 – 2013-02-17 05:43:00
你可以这样说:
r[0][:8]
但是请注意,如果第一行小于8个像素这是不行的。为了解决这个问题,这样做:
from itertools import chain
r = list(chain.from_iterable(r))
r[:8]
或者(如果你不想import
整个模块):
r = [val for element in r for val in element]
r[:8]
好的非常感谢你的帮助很多上帝保佑你和你的家人 – 2013-02-17 04:43:08
抱歉再次打扰你,但有一些方法,我可以用8个整数替换多维数组中的前8个整数我创建的数组例如:array = [0,3,38,13,7,18,3,715]并替换多维数组中的整数以使多维数组看起来像[[50 43 39 ...] ,85 91 98] [40 34 32 ...,73 92 93] [40 34 25 ...,42 78 91] ..., [80 70 43 ...,40 84 83] [86 75 42 ...,42 90 85] [84 72 34 ...,31 80 88]] – 2013-02-17 04:58:27
做你想做的所有行吗?试试这个r[:,:8]
只想要第一行?试试这个r[0,:8]
嘿感谢您的帮助,请您帮我解决问题的第二部分 – 2013-02-17 05:11:10
编辑:关于什么DSM指出,OP是事实上使用numpy阵列。
我收回我的答案nneonneo是正确的
OP虽然使用numpy'array',但不是Python列表,而且'ndarray'具有许多功能该列表没有。 – DSM 2013-02-17 05:08:36
他确实是。在那种情况下,nneonneo的回答是确实如此。感谢您指出了这一点! – Shokodemon 2013-02-17 05:14:10
请问您可以帮我解答我的问题的第二部分 – 2013-02-17 05:17:38
我认为这可能是更简单。此示例使用随机矩阵(这将是你r
矩阵):
In [7]: from pylab import * # convention
In [8]: r = randint(0,10,(10,10)) # this is your image
In [9]: r
array([[7, 9, 5, 5, 6, 8, 1, 4, 3, 4],
[5, 4, 4, 4, 2, 6, 2, 6, 4, 2],
[1, 4, 9, 9, 2, 6, 1, 9, 0, 6],
[5, 9, 0, 7, 9, 9, 5, 2, 0, 7],
[8, 3, 3, 9, 0, 0, 5, 9, 2, 2],
[5, 3, 7, 8, 8, 1, 6, 3, 2, 0],
[0, 2, 5, 7, 0, 1, 0, 2, 1, 2],
[4, 0, 4, 5, 9, 9, 3, 8, 3, 7],
[4, 6, 9, 9, 5, 9, 3, 0, 5, 1],
[6, 9, 9, 0, 3, 4, 9, 7, 9, 6]])
然后,先提取8列,并做一些
In [17]: r_8 = r[:,:8] # extract columns
In [18]: r_8
Out[18]:
array([[7, 9, 5, 5, 6, 8, 1, 4],
[5, 4, 4, 4, 2, 6, 2, 6],
[1, 4, 9, 9, 2, 6, 1, 9],
[5, 9, 0, 7, 9, 9, 5, 2],
[8, 3, 3, 9, 0, 0, 5, 9],
[5, 3, 7, 8, 8, 1, 6, 3],
[0, 2, 5, 7, 0, 1, 0, 2],
[4, 0, 4, 5, 9, 9, 3, 8],
[4, 6, 9, 9, 5, 9, 3, 0],
[6, 9, 9, 0, 3, 4, 9, 7]])
In [19]: r_8 = r_8 * 2 # do something
In [20]: r_8
Out[20]:
array([[14, 18, 10, 10, 12, 16, 2, 8],
[10, 8, 8, 8, 4, 12, 4, 12],
[ 2, 8, 18, 18, 4, 12, 2, 18],
[10, 18, 0, 14, 18, 18, 10, 4],
[16, 6, 6, 18, 0, 0, 10, 18],
[10, 6, 14, 16, 16, 2, 12, 6],
[ 0, 4, 10, 14, 0, 2, 0, 4],
[ 8, 0, 8, 10, 18, 18, 6, 16],
[ 8, 12, 18, 18, 10, 18, 6, 0],
[12, 18, 18, 0, 6, 8, 18, 14]])
现在,这是诀窍。用hstack
替换r
中的前8列:
In [21]: r = hstack((r_8, r[:,8:])) # it replaces the FISRT 8 columns, note the indexing notation
In [22]: r
Out[22]:
array([[14, 18, 10, 10, 12, 16, 2, 8, 3, 4], # it does not touch the last 2 columns
[10, 8, 8, 8, 4, 12, 4, 12, 4, 2],
[ 2, 8, 18, 18, 4, 12, 2, 18, 0, 6],
[10, 18, 0, 14, 18, 18, 10, 4, 0, 7],
[16, 6, 6, 18, 0, 0, 10, 18, 2, 2],
[10, 6, 14, 16, 16, 2, 12, 6, 2, 0],
[ 0, 4, 10, 14, 0, 2, 0, 4, 1, 2],
[ 8, 0, 8, 10, 18, 18, 6, 16, 3, 7],
[ 8, 12, 18, 18, 10, 18, 6, 0, 5, 1],
[12, 18, 18, 0, 6, 8, 18, 14, 9, 6]])
我对此也不确定。会不会是r [0] [:8]? – kufudo 2013-02-17 04:30:15
@kufudo:对于第一行中的前8个像素,是的。 ('r [0,:8]'是一个稍微短一点的numpy特定语法)。 – nneonneo 2013-02-17 04:32:49
这两个解决方案的工作感谢家伙我不相信这是这么简单,至少我得到了正确答案的一半上帝保佑你 – 2013-02-17 04:36:33