2013-02-17 108 views
2

这是我第一次处理多维数组,并且在访问元素时遇到问题。我试图获取图片的红色像素,但只是数组中的前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] 
+1

我对此也不确定。会不会是r [0] [:8]? – kufudo 2013-02-17 04:30:15

+1

@kufudo:对于第一行中的前8个像素,是的。 ('r [0,:8]'是一个稍微短一点的numpy特定语法)。 – nneonneo 2013-02-17 04:32:49

+0

这两个解决方案的工作感谢家伙我不相信这是这么简单,至少我得到了正确答案的一半上帝保佑你 – 2013-02-17 04:36:33

回答

3

由于您处理图像,r是一个二维数组。为了让图像中的第8个像素,尽量

r.flatten()[:8] 

这将自动环绕如果第一行具有小于8个像素。

+0

你好你能帮我第二部分请 – 2013-02-17 05:07:29

+0

请发表一个新问题。 – nneonneo 2013-02-17 05:30:04

+0

好的我添加了另一个问题喜欢你问 – 2013-02-17 05:43:00

1

你可以这样说:

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] 
+0

好的非常感谢你的帮助很多上帝保佑你和你的家人 – 2013-02-17 04:43:08

+0

抱歉再次打扰你,但有一些方法,我可以用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

1

做你想做的所有行吗?试试这个r[:,:8]

只想要第一行?试试这个r[0,:8]

+0

嘿感谢您的帮助,请您帮我解决问题的第二部分 – 2013-02-17 05:11:10

0

编辑:关于什么DSM指出,OP是事实上使用numpy阵列

我收回我的答案nneonneo是正确的

+0

OP虽然使用numpy'array',但不是Python列表,而且'ndarray'具有许多功能该列表没有。 – DSM 2013-02-17 05:08:36

+0

他确实是。在那种情况下,nneonneo的回答是确实如此。感谢您指出了这一点! – Shokodemon 2013-02-17 05:14:10

+0

请问您可以帮我解答我的问题的第二部分 – 2013-02-17 05:17:38

1

我认为这可能是更简单。此示例使用随机矩阵(这将是你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]])