Khó làm thế nào để lặp qua các cột của mảng?


109

Giả sử tôi có và mxn mảng. Tôi muốn chuyển mỗi cột của mảng này cho một hàm để thực hiện một số thao tác trên toàn bộ cột. Làm cách nào để lặp qua các cột của mảng?

Ví dụ: tôi có một mảng 4 x 3 như

1  99 2
2  14 5
3  12 7
4  43 1

for column in array:
  some_function(column)

trong đó cột sẽ là "1,2,3,4" trong lần lặp đầu tiên, "99,14,12,43" trong lần thứ hai và "2,5,7,1" trong lần thứ ba.


2
Bạn không thể sử dụng chỉ mục --- stackoverflow.com/questions/4455076/…
ev-br

Câu trả lời:


225

Chỉ cần lặp lại phần đã hoán vị của mảng của bạn:

for column in array.T:
   some_function(column)

6
Cách tốt để kết hợp kết quả lại thành một mảng duy nhất là gì?
Ibrahim Muhammad

46
Đối với những người tự hỏi, array.Tkhông tốn kém, vì nó chỉ thay đổi 'bước tiến' của array(xem câu trả lời này cho một cuộc thảo luận thú vị)
drevicko

19

Điều này sẽ cho bạn một khởi đầu

>>> for col in range(arr.shape[1]):
    some_function(arr[:,col])


[1 2 3 4]
[99 14 12 43]
[2 5 7 1]

7
Với tôi, nó không giống con trăn.
gronostaj

@gronostaj Tất nhiên đó là Pythonic. Bạn sẽ giải quyết vấn đề này bằng cách nào khác khi bạn muốn lặp qua một trục tùy ý của mảng đa chiều?
Neil G

1
@NeilG Câu hỏi này hoàn toàn là về mảng 2 chiều.
gronostaj

6

Đối với mảng ba chiều, bạn có thể thử:

for c in array.transpose(1, 0, 2):
    do_stuff(c)

Xem tài liệu về cách array.transposehoạt động. Về cơ bản, bạn đang chỉ định thứ nguyên nào sẽ thay đổi. Trong trường hợp này, chúng tôi đang chuyển thứ nguyên thứ hai (ví dụ: cột) sang thứ nguyên đầu tiên.


5
for c in np.hsplit(array, array.shape[1]):
    some_fun(c)

4

Bạn cũng có thể sử dụng giải nén để lặp lại các cột

for col in zip(*array):
   some_function(col)

2

Ví dụ, bạn muốn tìm giá trị trung bình của mỗi cột trong ma trận. Hãy tạo ma trận sau

mat2 = np.array([1,5,6,7,3,0,3,5,9,10,8,0], dtype=np.float64).reshape(3, 4)

Hàm có nghĩa là

def my_mean(x):
    return sum(x)/len(x)

Để làm những gì cần thiết và lưu trữ kết quả trong 'kết quả' vectơ dấu hai chấm

results = np.zeros(4)
for i in range(0, 4):
    mat2[:, i] = my_mean(mat2[:, i])

results = mat2[1,:]      

Kết quả là: array ([4.33333333, 5., 5.66666667, 4.])


0

Ngoài ra, bạn có thể sử dụng enumerate. Nó cung cấp cho bạn số cột và các giá trị cột.

for num, column in enumerate(array.T):
    some_function(column) # column: Gives you the column value as asked in the question
    some_function(num) # num: Gives you the column number 

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.