python - 如何找出`DataFrame.to_numpy`没有创建副本
问题描述
该pandas.DataFrame.to_numpy
方法具有copy
以下文档的参数:
复制:布尔值,默认为 False
是否确保返回值不是另一个数组上的视图。请注意, copy=False 并不能确保 to_numpy() 是无副本的。相反, copy=True 确保制作副本,即使不是绝对必要的。
玩了一下,似乎调用to_numpy
在内存中相邻而不是混合类型的数据,保持一个视图。但是如何检查生成的 numpy 数组是否与创建它的数据帧共享内存,而不更改数据?
内存共享示例:
import pandas as pd
import numpy as np
# some data frame that I expect not to be copied
frame = pd.DataFrame(np.arange(144).reshape(12,12))
array = frame.to_numpy()
array[:] = 0
print(frame)
# Prints:
# 0 1 2 3 4 5 6 7 8 9 10 11
# 0 0 0 0 0 0 0 0 0 0 0 0 0
# 1 0 0 0 0 0 0 0 0 0 0 0 0
# 2 0 0 0 0 0 0 0 0 0 0 0 0
# 3 0 0 0 0 0 0 0 0 0 0 0 0
# 4 0 0 0 0 0 0 0 0 0 0 0 0
# 5 0 0 0 0 0 0 0 0 0 0 0 0
# 6 0 0 0 0 0 0 0 0 0 0 0 0
# 7 0 0 0 0 0 0 0 0 0 0 0 0
# 8 0 0 0 0 0 0 0 0 0 0 0 0
# 9 0 0 0 0 0 0 0 0 0 0 0 0
# 10 0 0 0 0 0 0 0 0 0 0 0 0
# 11 0 0 0 0 0 0 0 0 0 0 0 0
不共享内存的示例:
import pandas as pd
import numpy as np
# some data frame that I expect to be copied
types = [int, str, float]
frame = pd.DataFrame({
i: [types[i%len(types)](value) for value in col]
for i, col in enumerate(np.arange(144).reshape(12,12).T)
})
array = frame.to_numpy()
array[:] = 0
print(frame)
# Prints:
# 0 1 2 3 4 5 6 7 8 9 10 11
# 0 0 12 24.0 36 48 60.0 72 84 96.0 108 120 132.0
# 1 1 13 25.0 37 49 61.0 73 85 97.0 109 121 133.0
# 2 2 14 26.0 38 50 62.0 74 86 98.0 110 122 134.0
# 3 3 15 27.0 39 51 63.0 75 87 99.0 111 123 135.0
# 4 4 16 28.0 40 52 64.0 76 88 100.0 112 124 136.0
# 5 5 17 29.0 41 53 65.0 77 89 101.0 113 125 137.0
# 6 6 18 30.0 42 54 66.0 78 90 102.0 114 126 138.0
# 7 7 19 31.0 43 55 67.0 79 91 103.0 115 127 139.0
# 8 8 20 32.0 44 56 68.0 80 92 104.0 116 128 140.0
# 9 9 21 33.0 45 57 69.0 81 93 105.0 117 129 141.0
# 10 10 22 34.0 46 58 70.0 82 94 106.0 118 130 142.0
# 11 11 23 35.0 47 59 71.0 83 95 107.0 119 131 143.0
解决方案
# Your first example
print(np.shares_memory(array, frame)) # True, they are sharing memory
# Your second example
print(np.shares_memory(array2, frame2)) # False, they are not sharing memory
还有numpy.may_share_memory,它更快但只能用于确保事物不共享内存(因为它只检查边界是否重叠),所以严格来说不能回答这个问题。阅读此内容以了解差异。
小心使用带有 pandas 数据结构的这些 numpy 函数:
第一个示例np.shares_memory(frame, frame)
返回True
,但False
第二个示例返回,可能是因为__array__
第二个示例中的数据框的方法在幕后创建了一个副本。
推荐阅读
- flutter - 无法解析项目:url_launcher_macos
- xamarin.forms - 使用 Xamarin.Forms 中的 SharpZipLib 从 HttpClient 解压缩流
- html - 如何根据表头检查表中值的条件
- php - 字符串结尾时模式不匹配
- python - 如何推迟函数调用,直到导入模块?
- delphi - Windows Media Player 中的 Step() 函数
- python - 如何在 matplotlib 中保存绘图时修复错误?
- apache-kafka - Kafka 连接器始终作为单个任务工作
- sql - 这两个查询如何返回相同的结果但使用不同的连接?(隐式与显式查询)
- python - Scipy 集成:solve_ivp “总是比 odeint 更糟”吗?