programing

python: 변수가 배열인지 스칼라인지 식별하는 방법

prostudy 2022. 9. 11. 16:37
반응형

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

그러나 여기서 기술한 바와 같이, 이것 또한 완벽하지 않으며 (적어도 나에 따르면) 사전을 시퀀스로 잘못 분류할 것입니다.isinstancecollections.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__.

왜 그런지 물어봐도 될까요?그 이유는 다음과 같습니다.

  1. 인기 있는 방법isinstance(obj, abc.Sequence)PyTorch의 Tensor를 포함한 일부 객체에서 실패하는 이유는 그것들이 구현되지 않기 때문이다.__contains__.
  2. 유감스럽게도 Python의 collections.abc에는 다음 버전만을 확인하는 것은 없습니다.__len__그리고.__getitem__어레이 같은 오브젝트를 위한 최소한의 방법이라고 생각합니다.
  3. 리스트, 튜플, 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

반응형