developer tip

Numpy의 0d 배열이 스칼라로 간주되지 않는 이유는 무엇입니까?

optionbox 2020. 11. 27. 08:01
반응형

Numpy의 0d 배열이 스칼라로 간주되지 않는 이유는 무엇입니까?


확실히 0d 배열은 스칼라이지만 Numpy는 그렇게 생각하지 않는 것 같습니다 ... 내가 뭔가를 놓치고 있거나 개념을 오해하고 있습니까?

>>> foo = numpy.array(1.11111111111, numpy.float64)
>>> numpy.ndim(foo)
0
>>> numpy.isscalar(foo)
False
>>> foo.item()
1.11111111111

그것에 대해 너무 열심히 생각해서는 안됩니다. 궁극적으로 개인의 정신 건강과 장수에 더 좋습니다.

Numpy 스칼라 유형의 흥미로운 상황은 1x1 행렬을 스칼라 유형으로 저하시키는 우아하고 일관된 방법이 없다는 사실에서 시추되었습니다. 수학적으로는 같은 것이지만 매우 다른 코드로 처리됩니다.

많은 양의 과학 코드를 수행했다면 궁극적으로 max(a)모든 크기의 행렬, 심지어 스칼라에서도 작업하는 것과 같은 작업을 원할 것 입니다. 수학적으로 이것은 기대하기에 완벽하게 합리적입니다. 그러나 프로그래머에게 이것은 Numpy에서 스칼라를 표시하는 모든 것이 .shape 및 .ndim attirbute를 가져야 함을 의미하므로 적어도 ufunc는 Numpy에서 가능한 21 개의 스칼라 유형에 대한 입력에 대해 명시 적 유형 검사를 수행 할 필요가 없습니다.

반면에, 그들은 또한 기존의 파이썬 라이브러리를 작동해야 않는 스칼라 유형에 명시 적 유형 검사를 수행. 이것은 Numpy ndarray가 스칼라로 축소되었을 때 유형을 개별적으로 변경해야하기 때문에 딜레마이며 모든 액세스에 대한 검사를 수행하지 않고는 발생했는지 여부를 알 수있는 방법이 없습니다. 실제로 그 경로를 사용하면 스칼라 유형 표준에 따라 작업하는 것이 엄청나게 느려질 것입니다.

Numpy 개발자의 솔루션은 자체 스칼라 유형에 대해 ndarray 및 Python 스칼라 모두에서 상속하여 모든 스칼라도 .shape, .ndim, .T 등을 갖도록하는 것입니다. 1x1 행렬은 여전히 ​​존재하지만 그 용도는 다음과 같습니다. 스칼라를 다룰 것이라는 것을 안다면 낙담합니다. 이것은 이론적으로는 잘 작동하지만 가끔 페인트 롤러로 놓친 일부 장소를 볼 수 있으며 못생긴 내부는 모두가 볼 수 있도록 노출됩니다.

>>> from numpy import *
>>> a = array(1)
>>> b = int_(1)
>>> a.ndim
0
>>> b.ndim
0
>>> a[...]
array(1)
>>> a[()]
1
>>> b[...]
array(1)
>>> b[()]
1

이 이유가 정말 없습니다 이유 a[...]a[()]다른 일을 반환해야하지만, 않습니다. 이를 변경하기위한 제안이 있지만 1x1 어레이에 대한 작업을 완료하는 것을 잊은 것 같습니다.

잠재적으로 더 크고 해결할 수없는 문제는 Numpy 스칼라가 변경 불가능하다는 사실입니다. 따라서 스칼라를 ndarray로 "스프레이"하는 (수학적으로 배열을 스칼라로 축소하는 인접 연산)은 구현할 PITA입니다. 실제로 Numpy 스칼라를 성장시킬 수 없습니다. newaxis신비하게 작동 하더라도 정의에 따라 ndarray로 캐스팅 할 수 없습니다 .

>>> b[0,1,2,3] = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'numpy.int32' object does not support item assignment
>>> b[newaxis]
array([1])

Matlab에서 스칼라 크기를 늘리는 것은 완벽하게 수용 할 수 있고 두뇌가없는 작업입니다. Numpy에서는 스칼라로 시작하여 배열로 끝날 가능성이 있다고 생각하는a = array(a) 모든 곳에 삐걱 거리는 것을 고수 해야합니다. 나는 Numpy가 파이썬과 잘 어울리기 위해 왜 이런 식이어야하는지 이해하지만, 많은 새로운 스위처가 이것에 대해 깊이 혼란스러워한다는 사실을 바꾸지는 않습니다. 어떤 사람들은이 행동으로 고군분투하고 결국 인내했다는 명백한 기억을 가지고있는 반면, 너무 멀리 떠난 다른 사람들은 일반적으로 가장 무고한 꿈을 자주 괴롭히는 깊은 형태없는 정신적 상처를 남깁니다. 모두에게 추악한 상황입니다.


스칼라 배열을 약간 다르게 만들어야합니다.

>>> x = numpy.float64(1.111)
>>> x
1.111
>>> numpy.isscalar(x)
True
>>> numpy.ndim(x)
0

It looks like scalars in numpy may be a bit different concept from what you may be used to from a purely mathematical standpoint. I'm guessing you're thinking in terms of scalar matricies?

참고URL : https://stackoverflow.com/questions/773030/why-are-0d-arrays-in-numpy-not-considered-scalar

반응형