NaNs로 채워진 Numpy 행렬 만들기
나는 다음 코드를 가지고 있다.
r = numpy.zeros(shape = (width, height, 9))
그것은 a를 만든다.width x height x 9
0으로 채워진 행렬그 대신 초기화할 수 있는 기능이나 방법이 있는지 알고 싶다.NaN
쉬운 방법으로
벡터 작동에 루프(numpy)가 필요한 경우는 거의 없다.초기화되지 않은 배열을 만들고 모든 항목에 한 번에 할당할 수 있다.
>>> a = numpy.empty((3,3,))
>>> a[:] = numpy.nan
>>> a
array([[ NaN, NaN, NaN],
[ NaN, NaN, NaN],
[ NaN, NaN, NaN]])
나는 다른 대안들을 시간 맞춰 보았다.a[:] = numpy.nan
여기와a.fill(numpy.nan)
Blaenk가 게시한 바와 같이:
$ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a.fill(np.nan)"
10000 loops, best of 3: 54.3 usec per loop
$ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a[:] = np.nan"
10000 loops, best of 3: 88.8 usec per loop
타이밍은 에 대한 선호를 보여준다.ndarray.fill(..)
더 빠른 대안으로OTOH, 나는 Numpy의 편의 구현을 좋아하는데, 이때 전체 슬라이스에 값을 할당할 수 있는데, 코드의 의도는 매우 분명하다.
참고:ndarray.fill
즉, 내부 작업을 수행하므로numpy.empty((3,3,)).fill(numpy.nan)
대신 돌아올 것이다None
.
또 다른 옵션은, NumPy 1.8+에서 사용 가능한 옵션인 , 를 사용하는 것이다.
a = np.full([height, width, 9], np.nan)
이것은 꽤 유연해서 네가 원하는 다른 번호로 채울 수 있어.
나는 속도에 대해 제안된 대안을 비교했고, 충분히 큰 벡터/매트릭스를 채울 수 있도록 하기 위해, 다음을 제외한 모든 대안들을 발견했다.val * ones
그리고array(n * [val])
똑같이 빠르다.
플롯을 재현하는 코드:
import numpy
import perfplot
val = 42.0
def fill(n):
a = numpy.empty(n)
a.fill(val)
return a
def colon(n):
a = numpy.empty(n)
a[:] = val
return a
def full(n):
return numpy.full(n, val)
def ones_times(n):
return val * numpy.ones(n)
def list(n):
return numpy.array(n * [val])
b = perfplot.bench(
setup=lambda n: n,
kernels=[fill, colon, full, ones_times, list],
n_range=[2 ** k for k in range(20)],
xlabel="len(a)",
)
b.save("out.png")
에 대해 잘 아십니까?numpy.nan
?
다음과 같은 고유한 방법을 만들 수 있다.
def nans(shape, dtype=float):
a = numpy.empty(shape, dtype)
a.fill(numpy.nan)
return a
그러면
nans([3,4])
생산될 것이다
array([[ NaN, NaN, NaN, NaN],
[ NaN, NaN, NaN, NaN],
[ NaN, NaN, NaN, NaN]])
만약 당신이 즉시 기억하지 않는다면 당신은 항상 곱셈을 사용할 수 있다..empty
또는.full
방법:
>>> np.nan * np.ones(shape=(3,2))
array([[ nan, nan],
[ nan, nan],
[ nan, nan]])
물론 다른 수치 값과도 작동한다.
>>> 42 * np.ones(shape=(3,2))
array([[ 42, 42],
[ 42, 42],
[ 42, 42]])
그러나 @u0b34a0f6ae의 수용된 대답은 3배 더 빠르다(CPU 사이클, numpy 구문을 기억하기 위한 두뇌 사이클이 아니라;).
$ python -mtimeit "import numpy as np; X = np.empty((100,100));" "X[:] = np.nan;"
100000 loops, best of 3: 8.9 usec per loop
(predict)laneh@predict:~/src/predict/predict/webapp$ master
$ python -mtimeit "import numpy as np; X = np.ones((100,100));" "X *= np.nan;"
10000 loops, best of 3: 24.9 usec per loop
말했듯이 numpy.empty()가 가는 길이다.그러나 객체의 경우 채우기()는 다음과 같이 정확히 수행되지 않을 수 있다.
In[36]: a = numpy.empty(5,dtype=object)
In[37]: a.fill([])
In[38]: a
Out[38]: array([[], [], [], [], []], dtype=object)
In[39]: a[0].append(4)
In[40]: a
Out[40]: array([[4], [4], [4], [4], [4]], dtype=object)
한 가지 방법은 다음과 같다.
In[41]: a = numpy.empty(5,dtype=object)
In[42]: a[:]= [ [] for x in range(5)]
In[43]: a[0].append(4)
In[44]: a
Out[44]: array([[4], [], [], [], []], dtype=object)
그러나 여기서 아직 언급되지 않은 또 다른 가능성은 NumPy 타일을 사용하는 것이다.
a = numpy.tile(numpy.nan, (3, 3))
또한 준다.
array([[ NaN, NaN, NaN],
[ NaN, NaN, NaN],
[ NaN, NaN, NaN]])
나는 속도 비교에 대해 모른다.
또 다른 대안은.numpy.broadcast_to(val,n)
크기에 관계없이 일정한 시간에 반환되며 가장 효율적인 메모리(반복된 요소의 보기를 반환함)이기도 하다.주의할 점은 반환된 값이 읽기 전용이라는 것이다.
아래는 니코 슐뢰메르의 대답과 동일한 벤치마크를 사용하여 제안된 다른 모든 방법의 성과를 비교한 것이다.
초기화를 위해np.empty()
이후 값을 편집하지 않으면 (메모리 할당?) 문제가 발생할 수 있음:
arr1 = np.empty(96)
arr2 = np.empty(96)
print(arr1)
print(arr2)
# [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1. 1.
# 1. 1. 2. 2. 2. 2. nan nan nan nan nan nan nan nan 0. 0. 0. 0.
# 0. 0. 0. 0. nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan]
#
# [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1. 1.
# 1. 1. 2. 2. 2. 2. nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan]
배열에서 초기화된 플로트는 스크립트의 다른 위치에서 사용되지만 변수와 연결되지 않음arr1
또는arr2
조금도으스스하다.
사용자 @JHBonarius가 이 문제를 해결했다.
arr = np.tile(np.nan, 96)
print(arr)
# [nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan
# nan nan nan nan nan nan]
참조URL: https://stackoverflow.com/questions/1704823/create-numpy-matrix-filled-with-nans
'Programing' 카테고리의 다른 글
Python에서 XPath를 사용하는 방법? (0) | 2022.03.16 |
---|---|
Vue.js에서 생성된 이벤트와 마운트된 이벤트 간의 차이 (0) | 2022.03.16 |
기본 반응:종료 앱으로 다시 더블 백 누르기 (0) | 2022.03.16 |
동적 열이 있는 요소 UI 테이블 (0) | 2022.03.16 |
매개 변수를 사용하는 vue-properties가 netlify에서 배포를 실행할 수 없음 (0) | 2022.03.16 |