我正在尝试在C中使用64位整数,但我得到的混合信号是否应该是可能的.
当我执行printf时:
printf("Size of long int:%d\nSize of long long int:%d\n\n",(int)sizeof(long int), (int)sizeof(long long int));
Run Code Online (Sandbox Code Playgroud)
我得到的回应是:
long int的大小:4 long long int的大小:8
这让我觉得long long int有8个字节= 64位.
但是,当我尝试声明以下变量时:
long long int a2 = 0x00004444;
long long int b2 = 0x000044440;
long long int c2 = 0x0000444400;
long long int d2 = 0x00004444000;
long long int e2 = 0x000044440000;
long long int f2 = 0x0000444400004;
long long int g2 = 0x00004444000044;
long long int h2 = 0x000044440000444;
long long int i2 = 0x0000444400004444;
Run Code Online (Sandbox Code Playgroud)
最后4个变量(f2,g2,h2,i2)给出了错误信息: …
我试图了解Python的垃圾收集器如何检测循环引用.当我查看文档时,我看到的只是一个声明,即检测到循环引用,除非涉及的对象有__del__方法.
如果发生这种情况,我的理解(可能是错误的)是gc模块通过(我假设)遍历所有分配的内存并释放任何无法访问的块来充当故障保护.
在使用gc模块之前,Python如何检测和释放循环内存引用?
我正在阅读http://deeplearning.net/tutorial/logreg.html上给出的逻辑函数的代码.我对函数的inputs&givens变量之间的区别感到困惑.计算模型在小批量上所犯错误的函数是:
test_model = theano.function(inputs=[index],
outputs=classifier.errors(y),
givens={
x: test_set_x[index * batch_size: (index + 1) * batch_size],
y: test_set_y[index * batch_size: (index + 1) * batch_size]})
validate_model = theano.function(inputs=[index],
outputs=classifier.errors(y),
givens={
x: valid_set_x[index * batch_size:(index + 1) * batch_size],
y: valid_set_y[index * batch_size:(index + 1) * batch_size]})
Run Code Online (Sandbox Code Playgroud)
为什么不能/不会只创建x&y共享输入变量并在创建实际模型实例时定义它们?
我一直在努力学习如何为Python编写C扩展,并希望确定我理解PyArg_ParseTupleAndKeywords的工作原理.
我相信第一个参数是一个PyObject指针,它指向一个参数数组,这些参数按照它们传递的顺序传递给C-extension函数.第二个参数是传递的关键字列表,它们被传递的位置,以及非常可能的某种指示标记,告诉关键字开始和位置变得无关紧要.
然后,PyArg_ParseTupleAndKeywords使用其关键字列表(第四个参数)来映射用关键字指定的参数,以及格式字符串(第三个参数)和应该复制适当值的C变量(第五个和+参数)的地址.
我的理解是否正确?当我阅读在线文档时,我所看到的只是对"位置参数和关键字参数"的引用,这让我感到有些不知所措.处理PyArg_ParseTupleAndKeywords的Python解释器的文件在哪里?
如果我理解正确,
PyModule_Create中的PyMODINIT_FUNC 已被Python3.X 取代PyObject*然而,两者都返回Python 3.X,模块的初始化函数必须返回PyObject*模块 - 即
PyMODINIT_FUNC
PyInit_spam(void)
{
return PyModule_Create(&spammodule);
}
Run Code Online (Sandbox Code Playgroud)
而在Python2.X中,这不是必要的 - 即
PyMODINIT_FUNC
initspam(void)
{
(void) Py_InitModule("spam", SpamMethods);
}
Run Code Online (Sandbox Code Playgroud)所以,我的理智检查问题是:
现在,我只是在尝试非常简单的Python C扩展案例.也许如果我做得更多,那么答案就很明显,或者如果我试图将Python嵌入其他东西......
我想直接使用压缩的JPEG图像.我知道使用PIL/Pillow我可以在保存时压缩图像,然后回读压缩图像 - 例如
from PIL import Image
im1 = Image.open(IMAGE_FILE)
IMAGE_10 = os.path.join('./images/dog10.jpeg')
im1.save(IMAGE_10,"JPEG", quality=10)
im10 = Image.open(IMAGE_10)
Run Code Online (Sandbox Code Playgroud)
但是,我想要一种方法来做到这一点,而无需无关的写和读.是否有一些Python包带有一个函数,它将图像和质量数作为输入并返回具有给定质量的图像的jpeg版本?
我一直在使用代码来显示电影中的帧.代码的基本内容如下:
import cv2
import matplotlib.pyplot as plt
# Read single frame avi
cap = cv2.VideoCapture('singleFrame.avi')
rval, frame = cap.read()
# Attempt to display using cv2 (doesn't work)
cv2.namedWindow("Input")
cv2.imshow("Input", frame)
#Display image using matplotlib (Works)
b,g,r = cv2.split(frame)
frame_rgb = cv2.merge((r,g,b))
plt.imshow(frame_rgb)
plt.title('Matplotlib') #Give this plot a title,
#so I know it's from matplotlib and not cv2
plt.show()
Run Code Online (Sandbox Code Playgroud)
因为我可以使用matplotlib显示图像,所以我知道我已经成功阅读了它.
我不明白为什么我创建窗口并尝试使用cv2显示图像不起作用.没有cv2窗口出现.奇怪的是,如果我创建第二个cv2窗口,会出现"输入"窗口,但它只是一个空白/白色窗口.
我在这里错过了什么?
我一直在将蟒蛇与蟒蛇2.7一起使用
$ python
Python 2.7.14 |Anaconda custom (64-bit)| (default, Dec 7 2017, 17:05:42)
[GCC 7.2.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
Run Code Online (Sandbox Code Playgroud)
当我决定安装tensorflow时(由于某种原因,我使用了非gpu版本)
我使用的命令是:
$ conda install -c anaconda tensorflow-gpu
Run Code Online (Sandbox Code Playgroud)
但是,完成后(此cmd的输出详细信息如下),我不再需要conda了:
$ conda install -c conda-forge keras
Traceback (most recent call last):
File "/home/me/anaconda2/bin/conda", line 12, in <module>
from conda.cli import main
ModuleNotFoundError: No module named 'conda'
Run Code Online (Sandbox Code Playgroud)
(注意:我也不再拥有Keras),现在正在运行Python 3.7(!?):
$ python
Python 3.6.8 |Anaconda, Inc.| (default, Dec 30 2018, 01:22:34)
[GCC 7.3.0] on linux
Type "help", …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用Python C扩展,并且很好奇为什么可以从Python调用的C函数必须使用2个PyObject*参数并返回PyObject*.我写了以下"Hello World"扩展:
#include <Python.h>
static PyObject *
hello_world(PyObject *self, PyObject *noargs)
{
printf("Hello World\n");
return Py_BuildValue("");
}
// Module functions table.
static PyMethodDef
module_functions[] = {
{ "hello_world", hello_world, METH_NOARGS, "hello world method" },
{ NULL }
};
// This function is called to initialize the module.
PyMODINIT_FUNC
inittesty2(void)
{
Py_InitModule("testy2", module_functions);
}
Run Code Online (Sandbox Code Playgroud)
为什么我(特别是使用METH_NOARGS)不能使用以下hello_world方法:
static void
hello_world()
{
printf("Hello World\n");
}
Run Code Online (Sandbox Code Playgroud)
?
我正在学习Python-C扩展,并且很困惑为什么使用关键字参数的方法必须强制转换为PyCFunctions.
我对PyCFunction的理解是它需要两个指向PyObjects的指针并返回一个指向PyObject的指针 - 例如
PyObject* myFunc(PyObject* self, PyObject* args)
Run Code Online (Sandbox Code Playgroud)
如果我要使用一个使用关键字参数的函数,那么这个函数将使用三个指向PyObjects的指针并返回一个指向PyObject的指针 - 例如
PyObject* myFunc(PyObject* self, PyObject* args, PyObject* keywordArgs)
Run Code Online (Sandbox Code Playgroud)
但是,当我创建模块函数数组时(对于一个名为'adder'的函数):
{ "adder", (PyCFunction)adder, METH_VARARGS | METH_KEYWORDS, "adder method" }
Run Code Online (Sandbox Code Playgroud)
工作良好.感觉就像我将一个浮点数转换为int并仍然使用浮点数的非整数部分.如果我没有看到这项工作,我会认为它不会起作用.我在这里不理解什么?
此外,我看到一些PyCFunctionWithKeywords的引用,它似乎有我认为我需要的函数签名,但我的编译器抱怨(发出警告)'不兼容的指针类型'.
是不是弃用了PyCFunctionWithKeywords?如果没有,是否有时间我应该/必须使用它?
python ×7
c ×2
64-bit ×1
anaconda ×1
conda ×1
cpython ×1
image ×1
jpeg ×1
matplotlib ×1
opencv ×1
pillow ×1
python-3.x ×1
python-c-api ×1
sizeof ×1
theano ×1