Helpex - Trao đổi & giúp đỡ Đăng nhập
71

Tôi có một mảng có thể trông như thế này:

ANOVAInputMatrixValuesArray = [[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 
0.53172222], [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]]

Lưu ý rằng một trong các hàng có giá trị 0 ở cuối. Tôi muốn xóa bất kỳ hàng nào chứa số 0, trong khi vẫn giữ bất kỳ hàng nào chứa giá trị khác không trong tất cả các ô.

Nhưng mảng sẽ có số lượng hàng khác nhau mỗi lần được điền và các số 0 sẽ được đặt ở các hàng khác nhau mỗi lần.

Tôi nhận được số phần tử khác không trong mỗi hàng với dòng mã sau:

NumNonzeroElementsInRows    = (ANOVAInputMatrixValuesArray != 0).sum(1)

Đối với mảng trên, NumNonzeroElementsInRowschứa: [5 4]

Năm chỉ ra rằng tất cả các giá trị có thể có trong hàng 0 là khác không, trong khi bốn giá trị chỉ ra rằng một trong các giá trị có thể có trong hàng 1 là số không.

Do đó, tôi đang cố gắng sử dụng các dòng mã sau để tìm và xóa các hàng chứa giá trị 0.

for q in range(len(NumNonzeroElementsInRows)):
    if NumNonzeroElementsInRows[q] < NumNonzeroElementsInRows.max():
        p.delete(ANOVAInputMatrixValuesArray, q, axis=0)

Nhưng vì một số lý do, mã này dường như không làm gì cả, mặc dù thực hiện nhiều lệnh in chỉ ra rằng tất cả các biến dường như được điền chính xác dẫn đến mã.

Phải có một số cách dễ dàng để đơn giản là "xóa bất kỳ hàng nào chứa giá trị 0".

Bất cứ ai có thể chỉ cho tôi mã để viết để thực hiện điều này?

71 hữu ích 0 bình luận 185k xem chia sẻ
132

Cách đơn giản nhất để xóa các hàng và cột khỏi mảng là numpy.deletephương thức.

Giả sử tôi có mảng sau x:

x = array([[1,2,3],
        [4,5,6],
        [7,8,9]])

Để xóa hàng đầu tiên, hãy làm điều này:

x = numpy.delete(x, (0), axis=0)

Để xóa cột thứ ba, hãy làm điều này:

x = numpy.delete(x,(2), axis=1)

Vì vậy, bạn có thể tìm thấy các chỉ số của các hàng có 0 trong đó, đặt chúng vào danh sách hoặc bộ dữ liệu và chuyển nó làm đối số thứ hai của hàm.

132 hữu ích 3 bình luận chia sẻ
13

Đây là một lớp lót (vâng, nó tương tự như user333700, nhưng đơn giản hơn một chút):

>>> import numpy as np
>>> arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222], 
                [ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
>>> print arr[arr.all(1)]
array([[ 0.96488889,  0.73641667,  0.67521429,  0.592875  ,  0.53172222]])

Nhân tiện, phương thức này nhanh hơn nhiều so với phương thức mảng bị che cho các ma trận lớn. Đối với ma trận 2048 x 5, phương pháp này nhanh hơn khoảng 1000 lần.

Nhân tiện, phương pháp của user333700 (từ nhận xét của anh ấy) đã nhanh hơn một chút trong các thử nghiệm của tôi, mặc dù nó làm tôi suy nghĩ tại sao.

13 hữu ích 2 bình luận chia sẻ
5

Điều này tương tự như cách tiếp cận ban đầu của bạn và sẽ sử dụng ít không gian hơn câu trả lời của unutbu , nhưng tôi nghi ngờ nó sẽ chậm hơn.

>>> import numpy as np
>>> p = np.array([[1.5, 0], [1.4,1.5], [1.6, 0], [1.7, 1.8]])
>>> p
array([[ 1.5,  0. ],
       [ 1.4,  1.5],
       [ 1.6,  0. ],
       [ 1.7,  1.8]])
>>> nz = (p == 0).sum(1)
>>> q = p[nz == 0, :]
>>> q
array([[ 1.4,  1.5],
       [ 1.7,  1.8]])

Nhân tiện, dòng của bạn p.delete()không hoạt động đối với tôi - ndarraykhông có .deletethuộc tính.

5 hữu ích 2 bình luận chia sẻ
2

numpy cung cấp một hàm đơn giản để thực hiện chính xác điều tương tự: giả sử bạn có một mảng bị che 'a', gọi numpy.ma.compress_rows (a) sẽ xóa các hàng chứa giá trị bị che. Tôi đoán cách này nhanh hơn nhiều ...

2 hữu ích 0 bình luận chia sẻ
0
import numpy as np 
arr = np.array([[ 0.96488889, 0.73641667, 0.67521429, 0.592875, 0.53172222],[ 0.78008333, 0.5938125, 0.481, 0.39883333, 0.]])
print(arr[np.where(arr != 0.)])
0 hữu ích 0 bình luận chia sẻ
1

Tôi có thể quá muộn để trả lời câu hỏi này, nhưng muốn chia sẻ ý kiến ​​đóng góp của tôi vì lợi ích của cộng đồng. Trong ví dụ này, hãy để tôi gọi ma trận của bạn là 'ANOVA' và tôi giả sử bạn chỉ đang cố gắng xóa các hàng khỏi ma trận này bằng 0 chỉ trong cột thứ 5.

indx = []
for i in range(len(ANOVA)):
    if int(ANOVA[i,4]) == int(0):
        indx.append(i)

ANOVA = [x for x in ANOVA if not x in indx]
1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python numpy delete-row , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading