這是我第一次處理多維數組,並且在訪問元素時遇到問題。我試圖獲取圖片的紅色像素,但只是數組中的前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]
這是我第一次處理多維數組,並且在訪問元素時遇到問題。我試圖獲取圖片的紅色像素,但只是數組中的前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