두 가지보기를 사용하여 Numpy.recarray를 수정하는 방법
-
20-08-2019 - |
문제
나는 Python과 Numpy를 처음 접했으며, 가면에 뷰를 적용 할 때 Numpy.recarray를 수정할 수 없다는 문제에 직면하고 있습니다. 파일에서 Recarray를 읽은 다음 두 개의 마스크 뷰를 작성한 다음 For Loop의 값을 수정하려고합니다. 다음은 예제 코드입니다.
import numpy as np
import matplotlib.mlab as mlab
dat = mlab.csv2rec(args[0], delimiter=' ')
m_Obsr = dat.is_observed == 1
m_ZeroScale = dat[m_Obsr].scale_mean < 0.01
for d in dat[m_Obsr][m_ZeroScale]:
d.scale_mean = 1.0
그러나 결과를 인쇄 할 때
newFile = args[0] + ".no-zero-scale"
mlab.rec2csv(dat[m_Obsr][m_ZeroScale], newFile, delimiter=' ')
파일의 모든 scale_means는 여전히 0입니다.
나는 뭔가 잘못하고 있어야한다. 보기의 값을 수정하는 적절한 방법이 있습니까? 두 개의 조회수를 하나씩 적용하기 때문입니까?
고맙습니다.
해결책
나는 당신 이이 용어에서 "마스킹 된 견해"에서 오해를 가지고 있다고 생각하며 (다시) 읽어야합니다. 그 책 (이제 자유롭게 다운로드 할 수 있음) 이해를 명확히하기 위해.
섹션 3.4.2에서 인용합니다.
선택 객체 인 OBJ가 비 튜플 시퀀스 객체, ndarray (데이터 유형 정수 또는 bool) 또는 하나 이상의 서열 객체 또는 ndarray (데이터 유형 정수 또는 bool)가있는 튜플 인 경우 고급 선택이 트리거됩니다. 고급 인덱싱에는 정수와 부울의 두 가지 유형이 있습니다. 고급 선택은 항상 데이터 사본을 반환합니다 (보기를 반환하는 기본 슬라이싱과 대조).
여기서하고있는 것은 부울 종류의 고급 선택이므로 사본을 받고 어디에도 구속하지 않습니다. 사본을 변경 한 다음 버리게 한 다음 새 신선한 사본을 작성하십시오. 원본에서.
문제를 이해하면 솔루션이 간단해야합니다. 한 번 사본을 작성하고 해당 사본을 변경하고 동일한 사본을 작성하십시오. 즉:
dat = mlab.csv2rec(args[0], delimiter=' ')
m_Obsr = dat.is_observed == 1
m_ZeroScale = dat[m_Obsr].scale_mean < 0.01
the_copy = dat[m_Obsr][m_ZeroScale]
for d in the_copy:
d.scale_mean = 1.0
newFile = args[0] + ".no-zero-scale"
mlab.rec2csv(the_copy, newFile, delimiter=' ')