python: 변수가 배열인지 스칼라인지 식별하는 방법
는 인수를 받는 .NBins
로 이 50
"""""""""""""""""[0, 10, 20, 30]
알 수 NBins
스칼라인지 벡터인지, 아니면 다르게 말할까요?
이거 해봤어요.
>>> N=[2,3,5]
>>> P = 5
>>> len(N)
3
>>> len(P)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
>>>
보다시피, 나는 지원할 수 없다.len
로로 합니다.P
...뭐이 is 거?isarray
★★★★★★★★★★★★★★★★★」isscalar
★★★★★★★★★★★★?
감사합니다.
>>> import collections.abc
>>> isinstance([0, 10, 20, 30], collections.abc.Sequence)
True
>>> isinstance(50, collections.abc.Sequence)
False
주의:isinstance
합니다.체크박스를 켜겠습니다type(x) in (..., ...)
이치노
해 보는 것 같아요.not isinstance(x, (str, unicode))
@2080에서 설명한 바와 같이, 여기서도 이 방법을 사용할 수 없습니다.numpy
들어§:
>>> import collections.abc
>>> import numpy as np
>>> isinstance((1, 2, 3), collections.abc.Sequence)
True
>>> isinstance(np.array([1, 2, 3]), collections.abc.Sequence)
False
이 경우 @jpaddison3의 답변을 시험해 보십시오.
>>> hasattr(np.array([1, 2, 3]), "__len__")
True
>>> hasattr([1, 2, 3], "__len__")
True
>>> hasattr((1, 2, 3), "__len__")
True
그러나 여기서 기술한 바와 같이, 이것 또한 완벽하지 않으며 (적어도 나에 따르면) 사전을 시퀀스로 잘못 분류할 것입니다.isinstance
collections.abc.Sequence
분류됩니다.
>>> hasattr({"a": 1}, "__len__")
True
>>> from numpy.distutils.misc_util import is_sequence
>>> is_sequence({"a": 1})
True
>>> isinstance({"a": 1}, collections.abc.Sequence)
False
에 대한 할 수 , 더 할 수 있습니다.isinstance
름에따름름름름름:
>>> isinstance(np.array([1, 2, 3]), (collections.abc.Sequence, np.ndarray))
True
>>> isinstance([1, 2, 3], (collections.abc.Sequence, np.ndarray))
True
이전 답변에서는 배열이 python 표준 목록이라고 가정합니다.numpy를 자주 사용하는 사람으로서 다음과 같은 버마닉 테스트를 추천합니다.
if hasattr(N, "__len__")
@jamylak과 @jpaddison3의 답변을 함께 조합하여 입력과 같은 numpy 어레이에 대해 견고하고 목록과 같은 방법으로 처리할 필요가 있는 경우 를 사용해야 합니다.
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
이는 목록, 태플 및 numpy 어레이의 서브클래스에 대해 견고합니다.
(목록과 태플뿐만 아니라) 시퀀스의 다른 모든 서브클래스에 대해서도 견고하게 하려면
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
하죠?isinstance
하지 말 것type(P)
표값과? ??여기 예가 있습니다. 여기서 우리는 다음과 같은 동작을 만들고 연구합니다.NewList
하위 클래스. , 록의의 , , , , , , , , , , 。
>>> class NewList(list):
... isThisAList = '???'
...
>>> x = NewList([0,1])
>>> y = list([0,1])
>>> print x
[0, 1]
>>> print y
[0, 1]
>>> x==y
True
>>> type(x)
<class '__main__.NewList'>
>>> type(x) is list
False
>>> type(y) is list
True
>>> type(x).__name__
'NewList'
>>> isinstance(x, list)
True
★★★★★★★★★★★에도 불구하고x
★★★★★★★★★★★★★★★★★」y
, 「」에 의한 , 「」에 의한 처리type
을 사용하다 「」이기 때문에, 「」는 「」입니다.x
is of of of of의 입니다.list
를 사용합니다.isinstance(x,list)
대접하다x
★★★★★★★★★★★★★★★★★」y
같은 방법으로
numpy에 isscalar()와 동등한 것이 있습니까?네.
>>> np.isscalar(3.1)
True
>>> np.isscalar([3.1])
False
>>> np.isscalar(False)
True
>>> np.isscalar('abcd')
True
@jamylak의 접근법이 더 낫지만, 여기 다른 접근법이 있습니다.
>>> N=[2,3,5]
>>> P = 5
>>> type(P) in (tuple, list)
False
>>> type(N) in (tuple, list)
True
다른 대체 접근법(클래스 이름 속성 사용):
N = [2,3,5]
P = 5
type(N).__name__ == 'list'
True
type(P).__name__ == 'int'
True
type(N).__name__ in ('list', 'tuple')
True
Import할 필요가 없습니다.
다음은 제가 발견한 최고의 접근법입니다.★★★★★★★의 존재 확인__len__
그리고.__getitem__
.
왜 그런지 물어봐도 될까요?그 이유는 다음과 같습니다.
- 인기 있는 방법
isinstance(obj, abc.Sequence)
PyTorch의 Tensor를 포함한 일부 객체에서 실패하는 이유는 그것들이 구현되지 않기 때문이다.__contains__
. - 유감스럽게도 Python의 collections.abc에는 다음 버전만을 확인하는 것은 없습니다.
__len__
그리고.__getitem__
어레이 같은 오브젝트를 위한 최소한의 방법이라고 생각합니다. - 리스트, 튜플, ndarray, 텐서 등에서 동작합니다.
더 이상 소란 피우지 말고
def is_array_like(obj, string_is_array=False, tuple_is_array=True):
result = hasattr(obj, "__len__") and hasattr(obj, '__getitem__')
if result and not string_is_array and isinstance(obj, (str, abc.ByteString)):
result = False
if result and not tuple_is_array and isinstance(obj, tuple):
result = False
return result
대부분의 경우 문자열을 배열이 아닌 값으로 간주할 수 있기 때문에 기본 매개 변수를 추가했습니다.튜플도 마찬가지입니다.
>>> N=[2,3,5]
>>> P = 5
>>> type(P)==type(0)
True
>>> type([1,2])==type(N)
True
>>> type(P)==type([1,2])
False
제목에 있는 질문에 답하기 위해 변수가 스칼라인지 확인하는 직접적인 방법은 변수를 플로트로 변환하는 것입니다.구하면TypeError
,그런거 아냐.
N = [1, 2, 3]
try:
float(N)
except TypeError:
print('it is not a scalar')
else:
print('it is a scalar')
변수의 데이터 유형을 확인할 수 있습니다.
N = [2,3,5]
P = 5
type(P)
P의 데이터 유형으로 출력됩니다.
<type 'int'>
따라서 정수인지 배열인지 구분할 수 있습니다.
나는 그러한 기본적인 질문이 비단뱀으로 즉각적인 답을 가지고 있지 않은 것 같아 놀랍다.제안된 답변은 거의 모두 특정 유형 체크를 사용하는 것 같습니다.이것은 보통 python에서는 권장되지 않으며 특정 케이스에만 한정되어 있는 것처럼 보입니다(다른 수치 유형이나 반복 가능한 개체는 튜플이나 목록이 아닙니다).
저는 numpy를 Import하여 array.size를 사용하는 것이 좋습니다.예를 들어 다음과 같습니다.
>>> a=1
>>> np.array(a)
Out[1]: array(1)
>>> np.array(a).size
Out[2]: 1
>>> np.array([1,2]).size
Out[3]: 2
>>> np.array('125')
Out[4]: 1
주의:
>>> len(np.array([1,2]))
Out[5]: 2
단,
>>> len(np.array(a))
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-40-f5055b93f729> in <module>()
----> 1 len(np.array(a))
TypeError: len() of unsized object
간단하게 사용size
대신len
!
>>> from numpy import size
>>> N = [2, 3, 5]
>>> size(N)
3
>>> N = array([2, 3, 5])
>>> size(N)
3
>>> P = 5
>>> size(P)
1
Python의 일반적인 가이드라인은 허락이 아니라 용서를 구하는 것이기 때문에 시퀀스로부터 문자열/스칼라를 검출하는 가장 기본적인 방법은 정수가 포함되어 있는지 확인하는 것이라고 생각합니다.
try:
1 in a
print('{} is a sequence'.format(a))
except TypeError:
print('{} is a scalar or string'.format(a))
preds_test [ 0 ]는 형상입니다(128,128,1) isinstance() 함수를 사용하여 데이터 유형을 확인합니다.isinstance는 2개의 인수를 사용합니다.첫 번째 인수는 data, 두 번째 인수는 data type isinstance(preds_test[0], np.ndarray)입니다.출력은 True로 표시됩니다.이는 preds_test[0]가 배열임을 의미합니다.
언급URL : https://stackoverflow.com/questions/16807011/python-how-to-identify-if-a-variable-is-an-array-or-a-scalar
'programing' 카테고리의 다른 글
원칙의 기본값 (0) | 2022.09.12 |
---|---|
mysql에서 그룹 이름 전 날짜 및 시간별로 주문 (0) | 2022.09.11 |
파일에서 특정 행(행 번호별)을 읽는 방법 (0) | 2022.09.11 |
MySQL 8.x의 주요 버그 -- 외부 키 (0) | 2022.09.11 |
Java의 3차 연산자는 Java 7 이후 하나의 표현식만 평가합니다. Java 1.6 이하에서는 다른가요? (0) | 2022.09.11 |