'그리고' (boolean) vs '&' (bitwise) - 목록과 numpy 배열의 동작이 왜 다른가요?
목록에서 부울 연산과 비트 연산의 동작과 NumPy 배열의 차이를 설명하는 것은 무엇입니까?
의 적절한 사용법에 대해 혼란스럽습니다.& 대and다음 예제에 나와 있는 Python의 경우.
mylist1 = [True, True, True, False, True]
mylist2 = [False, True, False, True, False]
>>> len(mylist1) == len(mylist2)
True
# ---- Example 1 ----
>>> mylist1 and mylist2
[False, True, False, True, False]
# I would have expected [False, True, False, False, False]
# ---- Example 2 ----
>>> mylist1 & mylist2
TypeError: unsupported operand type(s) for &: 'list' and 'list'
# Why not just like example 1?
>>> import numpy as np
# ---- Example 3 ----
>>> np.array(mylist1) and np.array(mylist2)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
# Why not just like Example 4?
# ---- Example 4 ----
>>> np.array(mylist1) & np.array(mylist2)
array([False, True, False, False, False], dtype=bool)
# This is the output I was expecting!
이 답변과 이 답변은 부울 연산이지만 비트적인 연산이라는 것을 이해하는 데 도움이 되었습니다.
저는 개념을 더 잘 이해하기 위해 비트 연산에 대해 읽었지만 위의 4가지 예를 이해하기 위해 그 정보를 사용하기 위해 고군분투하고 있습니다.
출력으로 만, 저는 제가 예 4를 들 어 얻 수 있 때 에 괜 문 습 찮 니 기 다 을 원 출 보 을 력 하 면 는 ▁i ▁example , ▁about 습 니 / ▁still ▁confused ▁led ▁when을 사용해야 스럽습니다. 하지만 언제/어떻게/왜 사용해야 하는지 여전히 혼란스럽습니다.and 대&목록과 NumPy 배열이 이러한 연산자와 다르게 작동하는 이유는 무엇입니까?
Boolean 연산과 Bitwise 연산의 차이를 이해하여 목록과 NumPy 배열을 다르게 처리하는 이유를 설명할 수 있는 사람이 있습니까?
and두 식이 논리적인지 여부를 검정합니다.True하는 동안에&((와 함께 할 경우)True/False 둘 값)인 경우 True.
빈 으로 Python으로 처리됩니다.False 있지 않은 은 논리적으로 비있않 기은제 공기논 리적으 로은능본입니다.True이렇게 하면 목록이 비어 있는 경우에는 어떤 작업을 수행하고 목록이 비어 있지 않은 경우에는 다른 작업을 수행하려는 일반적인 사용 사례가 쉬워집니다.으로 이는 [False]라는 합니다.True:
>>> if [False]:
... print('True')
...
True
첫 있지 않고 논리적으로 "1"과 "1"이 됩니다.True 래서그 진한가치의 .and번째 ( 두 번째 있지 않으므로 논리적으로 논리적으로 두번목의우니다동합일과록목논로으리적로않있므으비지어은목록번경두째우리째의록▁(우▁is▁is▁the▁and▁(논로리적으▁non▁second▁list▁list▁second로않므▁that▁the으in▁therefore▁the두▁as▁same다)True그러나 이를 식별하려면 불필요한 계산 단계가 필요합니다.)
예를 들어, 목록은 임의의 다른 요소를 포함할 수 있기 때문에 비트 방식으로 의미 있게 결합할 수 없습니다.비트 단위로 결합할 수 있는 것은 다음과 같습니다.참과 거짓, 정수.
대조적으로 NumPy 개체는 벡터화된 계산을 지원합니다.즉, 여러 데이터에 대해 동일한 작업을 수행할 수 있습니다.
예 3은 벡터 기반 논리 혼란을 방지하기 때문에 (길이가 1보다 긴) NumPy 배열에 참 값이 없기 때문에 실패합니다.
된 비트 예 4 는 4 히 벡 화 입 니 다 비 트 된 터 단 순 ▁example 다 니 ▁simply ▁a 입 ▁is▁4 예 ▁4and작동.
맨 아래 줄
하지 않는 배을처리않정수조수학않는경행는에우지열하작을적하지수고의▁want▁if는▁you▁probably▁and경배에우▁manip,않▁you열ing는▁math▁are▁are수▁ofulations▁perform▁with를 원할 것입니다.
and.진리값의 , 조하려참값벡있터가다사다용니합음을으면을 사용하세요.
numpy와 함께&.
에 대하여list
첫째, 모든 것이 뒤따를 매우 중요한 지점입니다.
에서는 보파썬서는에이통는▁in.list어떤 식으로든 특별하지 않습니다(대부분 역사적 사고인 구성을 위한 귀여운 구문을 제외하고). 록에한번씩목▁once씩번한▁a▁list목.[3,2,6]만들어졌으며, 그것은 모든 면에서 숫자와 같은 평범한 파이썬 객체일 뿐입니다.3, 편집기{3,7} 또는함수lambda x: x+5.
(예, 요소 변경과 반복 및 기타 여러 가지를 지원합니다. 하지만 유형이 그렇습니다. 일부 작업은 지원하지만 일부 작업은 지원하지 않습니다.int는 권력으로 올리는 것을 지지하지만, 그것이 그것을 매우 특별하게 만들지는 않습니다. 그것은 단지 int가 무엇인지에 대한 것입니다.람다는 호출을 지원하지만, 그렇다고 해서 람다가 특별한 것은 아닙니다. 결국 람다의 목적이 바로 그것입니다:).
에 대하여and
and연산자가 아닙니다("for"라고 할 수 있지만, "for"를 연산자로 부를 수도 있습니다:).Python의 연산자는 어떤 유형의 객체에 대해 호출되는 (을 통해 구현되는) 메서드이며, 보통 그 유형의 일부로 작성됩니다., 일부피연대보방없평법만지은는류하에자한산가를▁there일ands▁to,없지만▁method▁but▁an,and그렇게 할 수 있습니다.
는 그는결입니다.and,▁, 치마▁just다와 같이 수 .for오버로드할 수 없습니다.완전히 일반적이며 지정된 프로토콜을 통해 통신합니다.프로토콜의 일부를 사용자 지정할 수 있지만, 그렇다고 해서 사용자가 사용자 지정할 수 있는 동작을 변경할 수 없습니다.and은 다음과 같습니다프로토콜은 다음과 같습니다.
파이썬이 "a와 b"를 해석하는 것을 상상해 보세요(이것은 문자 그대로 이런 식으로 일어나는 것이 아니라 이해하는 데 도움이 됩니다).그리고 "그리고"에 관해서, 그것은 방금 평가한 물체를 보고 질문합니다. (a) 당신은 사실입니까?(NOT: 당신은?)True?) 의 클래스 작성자인 경우 이 답변을 사용자 정의할 수 있습니다.한다면a"아니오"라고 대답합니다.and완전히 과 같이 말합니다. (b 완 전 히 건 너 를 평 않 지 되 같 말 으 합 니 이 다 과 다 음 며 가 전 뛰 혀 고 ) 말 같 니 합 ▁( 다 : ▁complete 이 b sk ▁( ips ▁says ▁at ▁b ) ▁ita결과는 내 결과입니다(NOT: False는 내 결과입니다).
한다면a안 요, 대하지않습다니.and질문: 당신의 길이는 얼마입니까? (다시 말하지만, 당신은 이것을 작성자로 사용자 지정할 수 있습니다.a의 클래스).한다면a 0번, 0번,and위와 동일하게 - 거짓으로 간주하고(거짓이 아님), b를 건너뛰고 제공합니다.a그 결과
한다면a 것("길이는 입니까?")에, 첫 에 "합니다. 즉, "진실입니까?", "네가 맞습니까?", "네?"라는 질문에 대답합니다.andb를 평가하고 다음과 같이 말합니다.b제 결과입니다.확인하지 않습니다.b어떤 질문이든
이 모든 것을 말할 수 있는 다른 방법은a and b 같습다니의와 거의 .b if a else a, 는 한됩니다.", a는 는한번평가됩니다만단,다▁except니▁a▁a평됩가는▁evaluated▁only.
이제 펜과 종이를 들고 몇 분 동안 앉아서 {a,b}가 {True,False}의 하위 집합일 때 부울 연산자가 예상하는 대로 정확히 작동한다고 확신합니다.하지만 저는 제가 여러분에게 이것이 훨씬 더 일반적이고, 여러분이 보시다시피, 훨씬 더 유용하다고 확신시켰기를 바랍니다.
그 둘을 합치는 것은
1. 이제을당예의신 1이를기바랍다니하해▁now다바니랍▁1을를.and인지 여부는. mylist1은 Argmhbl 클래스의 개체입니다. mylist1, mylist1은 Argmhbl의 개체입니다.프로토콜의 질문에 대한 제 리스트1의 답변에 관심이 있을 뿐입니다.그리고 물론, 제 리스트1은 길이에 대한 질문에 5번 답했습니다. 그래서 제 리스트2를 돌려줍니다.그리고 이것이 마지막입니다. - 은 어디에도 mylist1과 mylist2의 요소입니다. 그들은 어디에도 사진을 입력하지 않습니다.
번째 예: 두번째예:&list
에반면은,&는 다른로 다른사람같연은산들, 면예를다니와 같은 입니다.+에 대한 를 정의하여 할 수 .클래스에 특수 메서드를 정의하여 해당 유형에 대해 정의할 수 있습니다. int는 비트 단위의 "and"로 정의하고, bool은 논리적인 "and"로 정의하지만, 이는 하나의 옵션일 뿐입니다. 예를 들어, 집합과 딕트 키 보기와 같은 일부 다른 개체는 집합 교차로로 정의합니다. list단지 그것을 정의하지 못했을 뿐입니다. 아마도 Guido가 그것을 정의할 명확한 방법을 생각하지 못했기 때문일 것입니다.
둔감한
반면에, Numpy 배열은 특별하거나 최소한 그렇게 하려고 노력하고 있습니다.물론 numpy.array는 클래스일 뿐이므로 재정의할 수 없습니다.and는 "진실입니까?"라는시켜 "을 바꿔주세요, 제모델에 ("mumpy.array"에 대해 .라는 질문을 받으면 ValueError를 발생시켜 "질문의 표현을 바꿔주세요. 제 진실에 대한 관점이 당신의 모델에 맞지 않습니다."라고 효과적으로 말합니다. (ValueError 메시지는 에 대해 말하지 않습니다.and왜냐하면 numpy.array는 누가 그것을 질문하는지 모르기 때문입니다; 그것은 단지 진실에 대해 말할 뿐입니다.)
위해서&할 수 numpy.array는 numpy.array를 합니다.&다른 연산자와 일관성이 있습니다. 즉, 점으로 표시됩니다.결국 원하는 것을 얻을 수 있습니다.
HTH,
연산자and,or새로운 언어 기능을 도입하거나 단락 회로를 희생하지 않고는 이를 수행할 수 있는 만족스러운 방법이 없기 때문에 )을(를) 무시할 수 없습니다.도 있고 도 있지만, 은 첫 값을 값에 두 두첫 하지 않습니다. 즉, 다음과 같은 경우에는 두 번째 인수를 반환하지 않습니다.
something_true and x -> x
something_false and x -> something_false
something_true or x -> something_true
something_false or x -> x
실제 피연산자를 평가한 결과는 실제 피연산자 값이 아니라 반환됩니다.
그들의 행동을 사용자 정의하는 유일한 방법은 그들의 행동을 무시하는 것입니다.__nonzero__((으)로 __bool__Python 3)에서는 반환되는 피연산자에 영향을 줄 수 있지만 다른 것은 반환되지 않습니다.목록(및 기타 컬렉션)은 항목이 포함된 경우 "truthy"이고 비어 있는 경우 "false"로 정의됩니다.
NumPy 어레이는 이러한 개념을 거부합니다.그들이 목표로 하는 활용 사례에 대해서는 (1) 어떤 요소가 참인지 여부와 (2) 모든 요소가 참인지 여부라는 두 가지 다른 진리 개념이 일반적입니다. 두 양립할 수 없으며, 둘다더하거나 더이지 않기 에, 에게 이 가 그 없 수 으 며 조 정 더 나 거 하 더 확 다 일 둘 는 히 용 적 반 추 이 않 합 구 니 다 할 용 것 을 요 사 로 명 으 적 시 거 게 에 자 사 용 을 고 측 하 부 두 지 .any()또는.all().
&그리고.|)not참고로) 단락되지 않기 때문에 완전히 오버라이드될 수 있습니다.그들은 재정의될 때 무엇이든 반환할 수 있으며, NumPy는 실제로 다른 스칼라 연산에서와 마찬가지로 요소별 연산을 수행하기 위해 그것을 잘 활용합니다.그러나 목록은 요소 전체에서 작업을 브로드캐스트하지 않습니다.처럼mylist1 - mylist2아무 의미도 없고,mylist1 + mylist2완전히 다른 것을 의미합니다, 없습니다.&목록에 대한 연산자입니다.
예 1:
이렇게 하면 및 연산자가 작동합니다.
x 및 y => x가 거짓이면 x, 그렇지 않으면 y
다시 시다말서해로이후그,서로▁so이▁since후그해▁words.mylist1아닙니다False는 그표의결과는현입니다.mylist2(공백 목록만 평가함)False.)
예 2:
그&연산자는 당신이 언급한 것처럼 약간 현명한 것입니다.비트 연산은 숫자에만 적용됩니다.a & b의 결과는 a와 b 모두에서 1인 비트의 1로 구성된 숫자입니다.예:
>>> 3 & 1
1
이진 리터럴(위와 동일한 숫자)을 사용하여 발생하는 상황을 보다 쉽게 확인할 수 있습니다.
>>> 0b0011 & 0b0001
0b0001
비트 연산은 부울 연산과 개념이 비슷하지만 비트에서만 작동합니다.
제 차에 대한 몇 가지 진술을 보면
- 내 차는 빨간색입니다.
- 내 차는 바퀴가 있습니다.
이 두 문장의 논리적 "and"는 다음과 같습니다.
(내 차가 빨간색입니까?) 및 (차에 바퀴가 있습니까?)=> 잘못된 값의 논리적 참
적어도 내 차에 대해서는 둘 다 사실입니다.따라서 전체적으로 진술의 가치는 논리적으로 참입니다.
이 두 진술의 비트적인 "and"는 조금 더 모호합니다.
('내 차는 빨간색이다'라는 문구의 숫자 값) & ('내 차는 바퀴가 있다'라는 문구의 숫자 값) => 숫자
python이 문을 숫자 값으로 변환하는 방법을 알고 있다면, 그렇게 하고 비트 단위로 두 값의 값을 계산합니다.이것은 아마도 당신이 믿을 수 있도록 이끌 것입니다.& 됩니다.and그러나 위의 예와 같이 그것들은 다른 것들입니다.또한 변환할 수 없는 개체의 경우에는 다음과 같이 표시됩니다.TypeError.
예 3 및 4:
Numpy는 배열에 대한 산술 연산을 구현합니다.
ndarray에 대한 산술 및 비교 연산은 요소별 연산으로 정의되며 일반적으로 ndarray 객체를 산출합니다.
그러나 파이썬에서 논리 연산자를 오버로드할 수 없기 때문에 어레이에 대한 논리 연산을 구현하지 않습니다.그렇기 때문에 예제 3은 작동하지 않지만, 예제 4는 작동합니다.
그래서 당신의 대답은and 대&질문:.사용하다and.
비트 단위 연산은 숫자의 구조(어떤 비트가 설정되고 어떤 비트가 설정되지 않음)를 검사하는 데 사용됩니다.이러한 종류의 정보는 대부분 낮은 수준의 운영 체제 인터페이스(예: 유닉스 권한 비트)에서 사용됩니다.대부분의 파이썬 프로그램은 그것을 알 필요가 없습니다.
연산은 다음과 같습니다.and,or,not 항상 됩니다.), 그러항사용니다됩상나다.
에서는 Python 서는다 같표현사용다니합을은에의 입니다.
X and Y아온다를 합니다.Y점을bool(X) == True또는 그 중 일부X또는YFalse로 평가합니다. 예:True and 20 >>> 20 False and 20 >>> False 20 and [] >>> []비트 연산자는 단순히 목록에 대해 정의되지 않습니다.그러나 이 값은 정수에 대해 정의됩니다. 정수는 숫자의 이항 표현을 통해 작동합니다.16(01000)과 31(11111)을 고려합니다.
16 & 31 >>> 16NumPy는 심령술사가 아닙니다. 당신이 그것을 의미하는지는 모릅니다. 예를 들어.
[False, False]같야 합니다아와 합니다.True동작을 "Python을 사용하는 빈 "입니다. "이 경우 빈 컬렉션은 다음과 같습니다.len(collection) == 0이라False".아마도 NumPy의 어레이 & 연산자의 예상 동작일 것입니다.
첫 번째 예와 장고의 문서에 근거한.
두목록을 합니다. 있지 은 '하므로 두 번째 은 를 반환합니다. 실제로 비어 있지 않은 목록은 Python에 대한 True 값으로 간주되므로 Python은 '마지막' True 값을 반환하므로 두 번째 목록입니다.
In [74]: mylist1 = [False]
In [75]: mylist2 = [False, True, False, True, False]
In [76]: mylist1 and mylist2
Out[76]: [False, True, False, True, False]
In [77]: mylist2 and mylist1
Out[77]: [False]
Python 목록이 있는 작업은 목록에서 작동합니다. list1 and list2여부를 확인합니다.list1비어 비어있반환됩니다며으다를 반환합니다.list1그렇다면, 그리고list2그렇지 않다면 list1 + list2을 참조하십시오.list2list1그래서 당신은 새로운 목록을 얻습니다.len(list1) + len(list2)요소들.
예: 다음과같이요로적소있때연는자산의가미만용&을 TypeError요소별 작업은 요소를 순환하지 않고 지원되지 않기 때문입니다.
Numpy 배열은 요소별 작업을 지원합니다. array1 & array2는 의 각 해 요 비 단 또 는 위트의 각 해당 에 대해 합니다.array1그리고.array2.array1 + array2는 의 각 해 요 합 계 합 니 산 다 을 대 한 당의 각 합니다.array1그리고.array2.
이는 다음에 대해 작동하지 않습니다.and그리고.or.
array1 and array2입니다.
if bool(array1):
return array2
else:
return array1
는 이를위당좋정필다니요합가의은은신해다▁▁ofition▁good▁a▁for에 대한 좋은 정의가 필요합니다.bool(array1)목록에서 , 는 " 썬파목서사용것는과경작우같다같업의니습다글정음과의로이는벌은록에되▁for다같▁that습"입니다.bool(list) == True한다면list는 비어 있지 , 비어있않습다니지다않입니다.False연산의 경우, 의 요소가 Numpy의 요소 되는지 여부를 해야 하는지 에 대해 의 모호성이 .True가 는또평모요로 됩니다.True둘 다 거의 틀림없이 옳기 때문에, numpy는 추측하지 않고 제기합니다.ValueError 때에bool()배열에서 (잘못된) 호출됩니다.
좋은 질문입니다.과 예 4대 4라 4찰 1과 4고 4니 :)에 대한 예 1과 4에 대한 합니다.and비트적으로&는 산자연, 내경한것에서 했습니다.sum교환입니다.뚱딴지 같은 놈sum그리고 파이sum행동도 다르게 합니다.예:
"매트"가 다음과 같은 누피 5x5 2d 배열이라고 가정합니다.
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20],
[21, 22, 23, 24, 25]])
그런 다음 numpy.sum(매트)은 전체 행렬의 총합을 제공합니다.반면에 sum(mat)과 같은 Python의 내장 합계는 축을 따라 합계됩니다.아래 참조:
np.sum(mat) ## --> gives 325
sum(mat) ## --> gives array([55, 60, 65, 70, 75])
언급URL : https://stackoverflow.com/questions/22646463/and-boolean-vs-bitwise-why-difference-in-behavior-with-lists-vs-nump
'programing' 카테고리의 다른 글
| GitHub에서 모든 저장소를 한 번에 복제하는 방법은 무엇입니까? (0) | 2023.07.08 |
|---|---|
| Excel에 있는 경우 중위수에 필요한 도움말 (0) | 2023.07.08 |
| 데이터 프레임의 행을 벡터로 변환 (0) | 2023.07.08 |
| SQL Server 데이터베이스의 테이블 수 계산 (0) | 2023.07.08 |
| 오버로드된 메서드에 대해 서로 다른 반품 유형을 가질 수 있습니까? (0) | 2023.07.08 |