Tôi có một danh sách chứa một số mảng có nhiều hình dạng khác nhau. Tôi muốn định hình lại danh sách mảng này thành một vectơ gọn gàng, sau đó thay đổi từng phần tử trong vectơ, sau đó định hình lại nó về danh sách mảng ban đầu.
Ví dụ:
输入
[numpy.zeros((2,2)), numpy.ones((3,3))]
sang vectơ
[0,0,0,0,1,1,1,1,1,1,1,1,1,1]
Tại một thời điểm chỉ có một phần tử được thay đổi. Ví dụ: thay đổi phần tử đầu tiên 0 thành 2
[0,2,0,0,1,1,1,1,1,1,1,1,1,1]
chuyển đổi nó trở lại
[mảng([[0,2],[0,0]]),mảng([[1,1,1],[1,1,1],[1,1,1]])]
Có thực hiện nhanh chóng không? Cảm ơn bạn rất nhiều.
Có vẻ như việc chuyển đổi sang danh sách và quay lại không hiệu quả. Thay vào đó, tại sao không tìm ra mảng nào để lập chỉ mục (và ở đâu) và chỉ cập nhật chỉ mục đó? Ví dụ
def thay đổi_element(arr1, arr2, ix, value):
which = ix >= arr1.size
mảng = [arr1, mảng2] [mà]
ix = ix - arr1.size nếu còn cái nào khác ix
arr.ravel()[ix] = giá trị
Dưới đây là một số cách sử dụng ví dụ:
>>> mảng1 = np.zeros((2, 2))
>>> mảng2 = np.ones((3, 3))
>>> phần tử thay đổi (arr1, mảng2, 1, 2)
>>> phần tử thay đổi (mảng1, mảng2, 6, 3.14)
>>> mảng1
mảng([[ 0., 2.],
[ 0., 0.]])
>>> mảng2
mảng([[ 1. , 1. , 3.14],
[ 1. , 1. , 1. ],
[ 1. , 1. , 1. ]])
>>> phần tử thay đổi (arr1, mảng2, 7, 3.14)
>>> mảng1
mảng([[ 0., 2.],
[ 0., 0.]])
>>> mảng2
mảng([[ 1. , 1. , 3.14],
[ 3.14, 1. , 1. ],
[ 1. , 1. , 1. ]])
Một số lưu ý - điều này cập nhật mảng. Nó không tạo ra một mảng mới. Nếu bạn thực sự cần tạo một mảng mới, tôi nghĩ bạn có thể np.copy
chúng và quay trở lại. Ngoài ra, điều này phụ thuộc vào mảng đang ở làm rối loạn
Trước và sau bộ nhớ chia sẻ. tôi không nhớ làm rối loạn
Trường hợp chính xác trong đó một mảng mới được trả về thay vì dạng xem mảng ban đầu. .
Khái quát hóa cho nhiều mảng hơn thực sự dễ dàng. Chúng ta chỉ cần duyệt qua danh sách mảng và xem ix
Nó có nhỏ hơn kích thước mảng không. Nếu vậy thì chúng ta đã tìm thấy mảng của mình. Nếu không, chúng ta cần bắt đầu với ix
trừ đi kích thước của mảng để biểu thị số phần tử mà chúng ta đã lặp lại cho đến nay:
def thay đổi_element(mảng, ix, giá trị):
cho mảng trong mảng:
nếu ix < mảng.size:
arr.ravel()[ix] = giá trị
trở lại
ix -= mảng.size
Bạn có thể gọi nó như trước đây:
Change_element([arr1, arr2], 6, 3.14159)
Tôi là một lập trình viên xuất sắc, rất giỏi!