2013-02-17 113 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]])