为什么在 f 字符串内进行空 ndarray 和空列表之间的比较会有不同的行为?

问题描述 投票:0回答:1

我用空的

ndarray
搞乱了一点,发现了一些意想不到的行为。最小工作示例:

import numpy as np

print(f"{np.empty(0)} :: {type(np.empty(0))}")
print(f"{[]} :: {type([])}")

print(f"internal -> {np.empty(0) == []} :: {type(np.empty == [])}")

external = np.empty(0) == []
print(f"external -> {external} :: {type(external)}")

给出输出:

[] :: <class 'numpy.ndarray'>`
[] :: <class 'list'>
internal -> [] :: <class 'bool'>
external -> [] :: <class 'numpy.ndarray'>

我对此有三个问题,我怀疑答案可能是相关的:

  1. 当将空数组与空列表(或空元组、空字典、空集或空数组的另一个实例)进行比较时,为什么 numpy 返回空数组而不是布尔值?
  2. 为什么我们在 f 字符串内部计算它时得到相同类型的结果?
  3. 为什么 numpy not 在比较空数组与空字符串时返回空数组(
    np.empty(0) == ''
    返回 False)?

基于尝试与空字符串进行比较时引发的

FutureWarning
,我猜测 (1) 的答案可能与 numpy 在没有元素的可迭代对象之间执行逐元素比较有关,但我并没有真正了解细节,也不知道为什么情况(2)和(3)似乎表现不同。

python numpy numpy-ndarray f-string
1个回答
0
投票

当您执行

np.empty(0) == ...
时,如果
...
是可迭代的,那么它将进行元素比较。由于
np.empty(0)
为空,因此没有任何内容可比较,因此它会生成一个具有
np.ndarray
数据类型的空
bool
。它不会返回
True
/
False
,因为它通常会生成布尔值数组,但它是空的。

关于“内部”/“外部”比较,该部分是一个拼写错误 - 您在“内部”版本中缺少对

np.empty
的函数调用。修正这个拼写错误,结果将是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.