Python numpy ndarrays让我失望!我可以回到Matlab吗?
假设我有一个期望ndarray矢量输入的函数.我使用numpy.asarray函数强制输入到我想要的形式,方便的是没有重复已经是ndarrays的东西.但是,如果标量被传入,它有时会变成0d数组而不是1d数组,具体取决于它是如何传入的.0d数组会导致问题,因为我可以索引它.
首先,为什么我不能?说x = np.array(1).那么x.size == 1,它应该有第0个元素.为什么我不能做x[0]或x[-1].我认为它想要像 python int,但它应该在int上进行改进,而不是故意给出相同的限制.
其次,如果numpy asarray函数有一些可选输入来强制输出始终至少为1d数组,那将是非常棒的.然后我可以做类似的事情x = np.asarray(x, force_at_least_1d=True).
但是,我能想出的最佳选择是检查ndim属性,如果它是0,则将其扩展为1.这对我来说感觉不对.我还缺少一些其他选择吗?
import numpy as np
def func(x, extra_check=True):
r"""Meaningless Example Function for stackoverflow."""
# force input to be ndarrays
x = np.asarray(x)
if x.size == 0:
print('Don''t do anything.')
# Extra test to deal with garbage 0D arrays so that they can be indexed by keep.
# This test is really bothering me. …Run Code Online (Sandbox Code Playgroud) 给定一个 numpy 数组,我想测试它是 datetime64 还是普通的数值数组。我在一些接受这两个选项的绘图函数中使用它,但是我不能对 datetime64 执行 a np.isnanor操作np.isinf,也不能np.isnat对数值数组执行 a 操作,所以我需要知道哪个是哪个。
问题是,根据原始数组的创建方式,我得到了不同的答案。
>>> import datetime
>>> import numpy as np
>>> x = np.datetime64('now', 'us')
>>> y = np.array([datetime.datetime.now()], dtype='datetime64[us]')
>>> isinstance(x, np.datetime64)
True
>>> isinstance(y, np.datetime64)
False
Run Code Online (Sandbox Code Playgroud)
到目前为止我想出的最好的办法是:
>>> str(x.dtype).startswith('datetime64')
True
>>> str(y.dtype).startswith('datetime64')
True
Run Code Online (Sandbox Code Playgroud)
这是最好的选择,还是有更好的方法?