我正在使用 MongoDB 将脚本的结果存储到数据库中。当我想将数据重新加载回 python 时,我需要将 JSON (或 BSON)字符串解码为 pydantic 基本模型。使用具有 JSON 兼容类型的 pydantic 模型,我可以这样做:
base_model = BaseModelClass.parse_raw(string)
Run Code Online (Sandbox Code Playgroud)
但默认json.loads解码器不知道如何处理 DataFrame。我可以将.parse_raw函数重写为:
from pydantic import BaseModel
import pandas as pd
class BaseModelClass(BaseModel):
    df: pd.DataFrame
    
    class Config:
        arbitrary_types_allowed = True
        json_encoders = {
            pd.DataFrame: lambda df: df.to_json()
        }
    @classmethod
    def parse_raw(cls, data):
        data = json.loads(data)
        data['df'] = pd.read_json(data['df'])
        return cls(**data)
Run Code Online (Sandbox Code Playgroud)
但理想情况下,我希望自动解码类型字段,pd.DataFrame而不是parse_raw每次都手动更改函数。有没有办法做类似的事情:
    class Config:
        arbitrary_types_allowed = True
        json_encoders = {
            pd.DataFrame: lambda df: df.to_json()
        } …Run Code Online (Sandbox Code Playgroud) 我有两个嵌套列表:
\na = [[1,2,3],[2,4,2]]\nb = [[5,5,5],[1,1,1]]\nRun Code Online (Sandbox Code Playgroud)\n我想将每组元素相乘并求和得到
\nc = [[30],[8]]\nRun Code Online (Sandbox Code Playgroud)\n哪个结果来自= [[1*5+2*5+3*5],[2*1,4*1,2*1]]
我\xc2\xb4ve尝试这样做:
\na = [[1,2,3],[2,4,2]]\nb = [[5,5,5],[1,1,1]]\nRun Code Online (Sandbox Code Playgroud)\n但我得到“无法将序列乘以“列表”类型的非 int”
\n是否有一种简单的列表理解方法可以避免 for 循环?
\n我正在尝试绘制 x、y 和 z 方向上三个箭头的颤动图,箭头颜色为绿色、红色和蓝色。由于某种原因,线条的颜色是正确的,但箭头的颜色是错误的,我不知道如何修复。这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.gca(projection='3d')
cols = ['r', 'g', 'b']
quivers = ax.quiver([0,0,0],[0,0,0],[0,0,0],[1,0,0],[0,1,0],[0,0,1], colors=cols)
ax.set_xlim3d([-2.0, 2.0])
ax.set_xlabel('X')
ax.set_ylim3d([-2.0, 2.0])
ax.set_ylabel('Y')
ax.set_zlim3d([-2, 2])
ax.set_zlabel('Z')
plt.show()
Run Code Online (Sandbox Code Playgroud)

我在为散点图标记着色时遇到一些问题。我有一个简单的数据框,其中包含值“pos”和其他两个值“af_min”和“af_max”。我想根据 af_x 和 af_y 的某些条件为标记着色,但由于我没有任何列可用作色调,因此我创建了自己的列“颜色”。
       pos      af_x      af_y  color 
0  3671023  0.200000  0.333333    2.0
1  4492071  0.176471  0.333333    2.0
2  4492302  0.222222  0.285714    2.0
3  4525905  0.298246  0.234043    2.0
4  4520905  0.003334  0.234043    1.0
5  4520905  0.400098  0.000221    0.0
6  4520905  0.001134  0.714043    1.0
7  4520905  0.559008  0.010221    0.0
Run Code Online (Sandbox Code Playgroud)
现在,我使用seaborn和seaborn调色板创建一个散点图:
sns.scatterplot(data = df,  x="af_x", y="af_y", hue="color", palette = "hsv", s=40, legend=False)
但结果如下:如您所见,一种色调不会着色,因为只有两种颜色:蓝色和红色。
。
现在发生了一些非常奇怪的事情:为了解决这个问题,我构建了自己的调色板广告将其添加到seaborn istance中。但是散点图不是用我选择的色调进行着色,而是用我前段时间在另一个脚本中使用的一些颜色进行着色,并且无法更改它们。这是情节:
这是代码:
           #violet      #green      #orange
 colors = ['#747FE3', '#8EE35D', '#E37346']
 sns.set_palette(sns.color_palette(colors))
 sns.scatterplot(data = df,  x="af_x", y="af_y", …Run Code Online (Sandbox Code Playgroud) 我有一个类似矩阵的
[[1, 2],
 [3, 4]]
Run Code Online (Sandbox Code Playgroud)
我想替换另一个矩阵中的 1:
[[1, 0],
 [1, 1]]
Run Code Online (Sandbox Code Playgroud)
制作这个矩阵:
[[1, 2, 0, 0],
 [3, 4, 0, 0],
 [1, 2, 1, 2],
 [3, 4, 3, 4]]
Run Code Online (Sandbox Code Playgroud)
第二个矩阵中的s1可以在任何位置,这只是一个例子。
我怎样才能做到这一点?
我使用 cuGraph 来计算图的最短路径,但它不是返回到特定顶点的最短路径,而是创建一个距离顶点前驱表:
        distance    vertex  predecessor
3935    0.000000    0       -1
3372    0.063761    1       173
3136    0.059330    2       236
395     0.096309    3       131
3780    0.078157    4       222
... ... ... ...
3886    0.157694    4886    4817
3062    0.226340    4887    4871
3895    0.171506    4888    4816
3057    0.165199    4889    4842
3898    0.213998    4890    4888
Run Code Online (Sandbox Code Playgroud)
如何使用该图获取到特定顶点的路径?
我知道我可以循环遍历它直到到达顶点 0,但这听起来效率不高。有没有办法使用矢量化来保持高效?
在C++中,代码如下:
#include <math.h>
#include <iostream>
int main() {
    std::cout << remainder(-177.14024960054252, 360) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
使用 x86-64 GCC 12.2 编译(https://godbolt.org/z/43MzbE1ve)
输出:
-177.14
Run Code Online (Sandbox Code Playgroud)
然而在Python中:
-177.14
Run Code Online (Sandbox Code Playgroud)
两者输出:
182.85975039945748
Run Code Online (Sandbox Code Playgroud)
根据 numpy 文档,np.remainder正在执行 IEEE 余数函数。根据 C++ 文档,remainder还执行 IEEE 余数函数。
为什么这两个数字不同?
我想用 a 替换代码中字典中的字符串键,dataclass以便我可以为键提供元数据以进行调试。但是,我仍然希望能够使用字符串来查找字典。我尝试使用替换函数实现数据类__hash__,但是我的代码未按预期工作:
from dataclasses import dataclass
@dataclass(eq=True, frozen=True)
class Key:
    name: str
    def __hash__(self):
        return hash(self.name)
k = "foo"
foo = Key(name=k)
d = {}
d[foo] = 1
print(d[k])  # Key Error
Run Code Online (Sandbox Code Playgroud)
这两个哈希函数是相同的:
print(hash(k) == hash(foo))  # True
Run Code Online (Sandbox Code Playgroud)
所以我不明白为什么这不起作用。
python ×8
matplotlib ×2
numpy ×2
c++ ×1
cudf ×1
dictionary ×1
graph-theory ×1
hash ×1
hue ×1
matrix ×1
pydantic ×1
rapids ×1
scatter ×1
scipy ×1
seaborn ×1