小编Pet*_*ine的帖子

准确理解data.table何时是对另一个data.table的引用(与副本)

我在理解传递的引用属性方面遇到了一些麻烦data.table.有些操作似乎"打破"了参考,我想准确理解发生了什么.

data.table从另一个创建a 时data.table(通过<-,然后更新新表:=,原始表也会被更改.这是预期的,按照:

?data.table::copystackoverflow:传递引用操作在数据表包中

这是一个例子:

library(data.table)

DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
#      a  b
# [1,] 1 11
# [2,] 2 12

newDT <- DT        # reference, not copy
newDT[1, a := 100] # modify new DT

print(DT)          # DT is modified too.
#        a  b
# [1,] 100 11
# [2,]   2 12
Run Code Online (Sandbox Code Playgroud)

但是,如果我:=<-赋值和:=上面的行之间插入非基础修改,DT现在不再修改:

DT = data.table(a=c(1,2), b=c(11,12))
newDT …
Run Code Online (Sandbox Code Playgroud)

copy r reference assignment-operator data.table

181
推荐指数
2
解决办法
3万
查看次数

难以确定 numpy int64 的类型

我无法识别numpy.int64对象,以便将它们转换为用于 json 序列化的基本 python int。isinstance通常有效,但在以下示例中无效,我很想了解为什么会这样。

>>> x
0
>>> type(x)
<class 'numpy.int64'>
>>> import numpy
>>> isinstance(x, numpy.int64)
False
Run Code Online (Sandbox Code Playgroud)

语境

上面的 x 来自我的应用程序,由to_dict熊猫数据帧生成。各种数据帧用于生成结果,因此我不能只使用熊猫to_json

如何识别 python 中的 numpy 类型中获取提示,我实际上已经成功地检测到这些项目(有时根本不是 numpy 对象),使用以下方法:

>>> (isinstance(x, (pd.np.ndarray, pd.np.generic)) and 
>>> pd.np.issubdtype(x, pd.np.dtype('int64')))
True
Run Code Online (Sandbox Code Playgroud)

但是如果有人能解释为什么第一个选项不起作用,我将非常感激,这样我就可以有足够的信心将其部署到我们的生产系统中。使用simplejson和使用的自定义JSONDecoderisinstance(obj, pd.np.int64)已经工作了几个月,但它突然停止使用上面的示例。

pickle.dumps(x)b'\x80\x03cnumpy.core.multiarray\nscalar\nq\x00cnumpy\ndtype\nq\x01X\x02\x00\x00\x00i8q\x02K\x00K\x01\x87q\x03Rq\x04(K\x03X\x01\x00\x00\x00<q\x05NNNJ\xff\xff\xff\xffJ\xff\xff\xff\xffK\x00tq\x06bC\x08\x00\x00\x00\x00\x00\x00\x00\x00q\x07\x86q\x08Rq\t.'

有趣的是,酸洗对象似乎解决了这个问题。

>>> isinstance(pickle.loads(pickle.dumps(x)), pd.np.int64)
True
Run Code Online (Sandbox Code Playgroud)

python numpy pandas

5
推荐指数
0
解决办法
990
查看次数

标签 统计

assignment-operator ×1

copy ×1

data.table ×1

numpy ×1

pandas ×1

python ×1

r ×1

reference ×1