我是Python的新手.
在使用Matlab多年之后,最近,我开始研究numpy/scipy
似乎numpy最基本的元素似乎是ndarray.在ndarray中,有以下属性:
ndarray.ndimndarray.shapendarray.size我对C++/JAVA类非常熟悉,但我是Python OOP的新手.
Q1:我的第一个问题是上述属性的身份是什么?
首先,我假设上面的属性可能是公共成员变量.但很快,我发现这a.ndim = 10不起作用(假设a是一个对象ndarray)所以,它似乎不是一个公共成员变量.
接下来,我猜测它们可能是类似于C++中的getter方法的公共方法.但是,当我尝试a.nidm()使用括号时,它不起作用.所以,它似乎不是一种公共方法.
另一种可能是它们是私有成员变量,但是打印a.ndim工作,因此它们不能是私有数据成员.
所以,我无法弄清楚上述属性的真实身份是什么.
Q2.我在哪里可以找到Python代码的实现ndarray?由于我在我的本地PC上安装了numpy/scipy,我想可能有一些方法来查看源代码,然后我认为一切都可能很清楚.
你能就此提出一些建议吗?
在 tensorflow 2.0-beta 之前,为了从 tf.data.Dataset 中检索第一个元素,我们可以使用如下所示的迭代器:
#!/usr/bin/python
import tensorflow as tf
train_dataset = tf.data.Dataset.from_tensor_slices([1.0, 2.0, 3.0, 4.0])
iterator = train_dataset.make_one_shot_iterator()
with tf.Session() as sess:
# 1.0 will be printed.
print (sess.run(iterator.get_next()))
Run Code Online (Sandbox Code Playgroud)
在 tensorflow 2.0-beta 中,上面的一次性迭代器似乎已被弃用。要打印出整个元素,我们可以使用下面的方法。
#!/usr/bin/python
import tensorflow as tf
train_dataset = tf.data.Dataset.from_tensor_slices([1.0, 2.0, 3.0, 4.0])
for data in train_dataset:
# 1.0, 2.0, 3.0, and 4.0 will be printed.
print (data.numpy())
Run Code Online (Sandbox Code Playgroud)
但是,如果我们只想从 tf.data.Dataset 中准确检索一个元素,那么我们如何使用 tensorflow 2.0 beta 呢?好像next(train_dataset)不支持。如上所示,使用旧的一次性迭代器可以轻松完成,但使用基于for的新方法不是很明显。
欢迎任何建议。
python iterator tensorflow tensorflow-datasets tensorflow2.0
根据我在网上看到的内容,以下似乎是从python中的整数数据组成的二进制文件中读取数据的示例:
in_file = open('12345.bin', 'rb');
x = np.fromfile(in_file, dtype = 'int32');
Run Code Online (Sandbox Code Playgroud)
在Matlab中,我认为相应的命令是:
in_file = fopen('12345.bin', 'rb');
x = fread(in_file, 'int32');
fclose(in_file);
Run Code Online (Sandbox Code Playgroud)
在Matlab中,文件应该fclose在完成使用后关闭.在NumPy中有没有相应的东西?
我对选择NumPy数组的列感到有些困惑,因为结果与Matlab甚至NumPy矩阵不同.请参阅以下案例.
在Matlab中,我们使用以下命令从矩阵中选择列向量.
x = [0, 1; 2 3]
out = x(:, 1)
Run Code Online (Sandbox Code Playgroud)
然后out成为[0; 2]列向量.
使用NumPy Matrix做同样的事情
x = np.matrix([[0, 1], [2, 3]])
out = x[:, 0]
Run Code Online (Sandbox Code Playgroud)
然后输出是np.matrix([[0], [2]])预期的,它是一个列向量.
但是,在NumPy数组的情况下
x = np.array([[0, 1], [2, 3]])
out = x[:, 0]
Run Code Online (Sandbox Code Playgroud)
输出是np.array([0, 2])1维的,因此它不是列向量.我的期望是应该的np.array([[0], [2]]).我有两个问题.
1. 为什么NumPy数组的输出与NumPy矩阵情况不同?这给我带来了很多困惑,但我认为这可能有一些原因.
2. 要从2-Dim NumPy数组中获取列向量,我应该执行其他操作,例如expand_dims
x = np.array([[0, 1], [2, 3]])
out = np.expand_dims(x[:, 0], axis = 1)
Run Code Online (Sandbox Code Playgroud) 这些天,我已经从Matlab转到了NumPy/SciPy.
今天,当我尝试加载以"二进制格式"存储的数据时,我遇到了一个奇怪的问题.音频数据以4字节单精度浮点数 格式存储.我先尝试了以下内容.
data = np.fromfile('out.raw', dtype=float) # This is wrong
plt.plot(data)
Run Code Online (Sandbox Code Playgroud)
但它没有用.经过一些搜索,我尝试了以下内容,它按预期工作:
data = np.fromfile('out.raw', dtype=np.float32) # This is okay.
plt.plot(data)
Run Code Online (Sandbox Code Playgroud)
根据我以前使用C/C++的经验,我曾预计"float"是一个4字节的单精度浮点类型.但事实证明浮点数是8字节数据,在上面的例子中,我应该使用np.float32.
我有两个问题.
Q1.为什么浮点数是8字节而不是4字节,这可能让C/C++程序员感到困惑?
Q2.为什么我不能使用dtype = float32.这会给我带来错误.我好像应该使用dtype = np.float32?
谢谢!
如果我们在 .bashrc 中设置自定义环境变量,如下所示:
TMP_STRING='tmp string'
Run Code Online (Sandbox Code Playgroud)
看来这个变量不能直接从 bash 脚本访问。
#!/bin/bash
echo $TMP_STRING
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,但它也不起作用:
#!/bin/bash
source ~/.bashrc
echo $TMP_STRING
Run Code Online (Sandbox Code Playgroud)
您能建议在这种情况下正确的方法是什么吗?谢谢你!
这些天,我使用Matlab/Octave超过十年后,从Matlab过渡到Python.我有两个简单的问题:
ans?os.system(),但在Matlab中我们可以只!在实际命令之前放置shell命令.Python中有类似的东西吗?我正在从Matlab/Octave过渡到NumPy/SciPy.当我在交互模式下使用Matlab时,我不时使用clear或clear [some_variable]从内存中删除该变量.例如,在阅读一些新数据以开始一组新的实验之前,我曾经在Matlab中清除数据.
我怎么能用NumPy/SciPy做同样的事情?
我做了一些研究,我发现有一个命令del,但我听说del实际上并没有清除内存,但变量从命名空间中消失了.我对吗?
话虽这么说,在NumPy/SciPy中模仿"清除"Matlab的最佳方式是什么?
我最近从Matlab/Octave切换到SciPy/NumPy,我喜欢它.但我发现有时候由于微妙的差异我会感到困惑.
在Matlab中,当我们声明一个大小为5的"行向量"时,我们使用以下命令:
x = [1, 2, 3 ,4, 5] % in matlab
Run Code Online (Sandbox Code Playgroud)
可以使用" size"命令检查此向量的大小,如下所示:
size(x)
ans =
1 5
Run Code Online (Sandbox Code Playgroud)
我曾假设NumPy中的以下内容与上面的内容完全相同.
x = np.array([1, 2, 3, 4, 5]) # in NumPy
Run Code Online (Sandbox Code Playgroud)
但是尺寸有些奇怪.
>>> np.shape(x)
(5,)
Run Code Online (Sandbox Code Playgroud)
尺寸不是(5, 1),但确实如此(5, ).它究竟意味着什么?我不太清楚为什么这个元组的第二个元素是空的.
我检查了以下返回(5,1)
y = np.array([[1], [2], [3], [4], [5]])
np.shape(y)
(5, 1)
Run Code Online (Sandbox Code Playgroud)
然后,"y"和NumPy中的"x"相同吗?我认为不是.我可能会误解某些东西,但任何人都可以启发我这个话题吗?
谢谢!
我正在转向Matlab到NumPy/SciPy,似乎np.fromfile和ndarray.tofile分别在matlab中对fread和fwrite进行了修改.
为了测试这些API,我首先创建了一个二进制文件,其中包含五个整数{1,2,3,4,5},采用二进制'int32'格式.
然后,我使用np.fromfile读取此文件.
In [365]:
in_file = open('12345.bin', 'rb'); x = np.fromfile(in_file, 'int32'); in_file.close()
Run Code Online (Sandbox Code Playgroud)
我检查它已成功读取,如下所示:
In [367]:
x
Out[366]:
array([1, 2, 3, 4, 5], dtype=int32)
Run Code Online (Sandbox Code Playgroud)
现在,我将其写为具有不同名称的文件.我的期望是这个输出文件应该与原始输入文件完全相同,即'12345.bin'.
In [368]:
out_file = open('12345out.bin', 'wb'); x.tofile(out_file, 'int32'); out_file.close()
Run Code Online (Sandbox Code Playgroud)
但令人惊讶的是,'12345out.bin'的大小是25个字节,而'12345.bin'是20个字节.出了点问题.我打开'12345out.bin'如下:
In [369]:
in_file = open('12345out.bin', 'rb'); x2 = np.fromfile(in_file, 'int32'); in_file.close()
In [370]:
x2
Out[370]:
array([1953392945, 1764897331, 842232942, 1953392947, 1765028403,
842232942], dtype=int32)
Run Code Online (Sandbox Code Playgroud)
因此,从上面的结果来看,我们发现某些事情是完全错误的.Coud有谁请帮助我,我做错了什么?