‘壹’ python resize和reshape的区别
0. reshape的参数
reshape的参数严格地说,应该是tuple类型(tuple of ints),似乎不是tuple也成(ints)。
>>> x = np.random.rand(2, 3)
>>> x.reshape((3, 2))
# 以tuple of ints
array([[ 0.19399632, 0.33569667],
[ 0.36343308, 0.7068406 ],
[ 0.89809989, 0.7316493 ]])
>>> x.reshape(3, 2)
array([[ 0.19399632, 0.33569667],
[ 0.36343308, 0.7068406 ],
[ 0.89809989, 0.7316493 ]])
1. .reshape 实现维度的提升
(3, ) (3, 1):前者表示一维数组(无行和列的概念),后者则表示一个特殊的二维数组,也即是一个列向量;
>> x = np.ones(3)
>> x
array([ 1., 1., 1.])
>> x.reshape(3, 1)
array([[ 1.],
[ 1.],
[ 1.]])
>> x.reshape(1, 3)
array([[ 1., 1., 1.]])
2. .reshape 与 .resize
reshape:有返回值,所谓有返回值,即不对原始多维数组进行修改;
resize:无返回值,所谓有返回值,即会对原始多维数组进行修改;
>> X = np.random.randn(2, 3)
>> X
array([[ 1.23077478, -0.70550605, -0.37017735],
[-0.61543319, 1.1188644 , -1.05797142]])
>> X.reshape((3, 2))
array([[ 1.23077478, -0.70550605],
[-0.37017735, -0.61543319],
[ 1.1188644 , -1.05797142]])
>> X
array([[ 1.23077478, -0.70550605, -0.37017735],
[-0.61543319, 1.1188644 , -1.05797142]])
>> X.resize((3, 2))
>> X
array([[ 1.23077478, -0.70550605],
[-0.37017735, -0.61543319],
[ 1.1188644 , -1.05797142]])
‘贰’ python中numpy矩阵重排列是按行还是按列
Numpy可以使用reshape()函数进行矩阵重排列,默认按行排列(C语言风格),通过修改order参数可以改为按列排列(Fortran风格)。参考例子:
In[1]:importnumpyasnp
In[2]:a=np.array([[1,2,3],[4,5,6]])
In[3]:printa
[[123]
[456]]
In[4]:b=a.reshape((3,2))#默认按行排列
In[5]:printb
[[12]
[34]
[56]]
In[6]:c=a.reshape((3,2),order='F')#改为Fortran风格的按列排列
In[7]:printc
[[15]
[43]
[26]]
‘叁’ python行转换成列怎么实现
可以使用Python字符串内置的替换方法把分隔符“,”替换成‘ ’ 换行符即可(Linux、MacOS下换行符为:" "):
iPython下演示
‘肆’ Python Opencv中对图像的reshape(1,48,48,1)转换的意思
用的 opencv 先灰度模糊,再二值化,找到图形轮廓最后确定中心点·~
‘伍’ Python气象数据处理进阶之Xarray(6):数据重组与换形
这一部分涉及到了常用的操作,比如调换维度的位置,给数据重新reshape换形等等,建议大家可以认真阅读这部分。
老样子,先新建一个数组
比如说在求某个东西时需要将时间维放在最后一维,但是数据本身的时间在第一维,那么便可以用到这个操作。
第一种是精准换位,指定每个维度的位置
第二种是单独换位,只对指定维度换位,将time放在最后,其余不变
第三种为全部换位,相当于数组转置
扩展指增加一个维度,压缩指将一个维度挤压掉
官方文档中接下来有一段是关于DataArray向DataSet转换的,个人感觉放在这一章节并不合理,我后边会整理放进Python气象数据处理进阶之Xarray(1)中(我觉得两种基础数据结构以及互相转换应该最开始介绍的)。所以接下来跳过这部分。
个人感觉可能处理站点数据会用到这个方法
换一个数组演示
现在将这个2维数组堆叠成1维
也可以拆分,其实就是反堆叠
最重要的是不同于Pandas,Xarray的stack不缺自动丢失缺测值!!!
Xarray还提供了将不同变量stack的例子,有兴趣的可以去看看。这个用法感觉比较鸡肋
这块比较难理解,建议还是先读第一篇文章,弄清数据结构,da数组显示Dimensions without coordinates: x,而通过da.set_index函数,将X设置为混合索引号。
之后便可以实线自由索引:
通过mda.reset_index('x')重置。
reorder_levels()函数允许调换索引顺序(个人感觉比较鸡肋)
这小节应该是这篇文章和数组换形换维同等重要的。
这就是对数组进行滚动。这个的作用主要在于做差分计算。虽然前边讲过Xarray提供了中央差计算函数,但是仍需要更灵活的操作,滚动函数就实现了这个目的。
‘陆’ 图解Python中数据分析工具包:Numpy
numpy是我学习python遇到的第一个第三方工具包,它可以让我们快速上手数据分析。numpy提供了向量和矩阵计算和处理的大部分接口。目前很多python的基础工具包都是基于numpy开发而来,比如 scikit-learn, SciPy, pandas, 还有 tensorflow。 numpy可以处理表格、图像、文本等数据,极大地方便我们处理和分析数据。本文主要内容来自于Jay Alammar的一篇文章以及自己学习记录。
原文地址: https://jalammar.github.io/visual-numpy/
使用过程中,如果希望 Numpy 能创建并初始化数组的值, Numpy 提供了 ones()、zeros() 和 random.random() 等方法。只需传递希望生成的元素数量(大小)即可:
还可以进行如下操作:
一般,需要数组和单个数字之间也可以进行运算操作(即向量和标量之间的运算)。比如说 data * 1.6 ,numpy利用一个叫做广播机制(broadcasting)的概念实现了这一运算。:
我们可以通过索引对numpy数据获取任意位置数据或者对数据切片
我们可以通过numpy自带的函数对数据进行一些想要的聚合计算,比如min、max 和 sum ,还可以使用 mean 得到平均值,使用 prod 得到所有元素的乘积,使用 std 得到标准差等等。
上述操作不仅可以应用于单维度数据,还可以用于多维度数据{(矩阵)。
同样可以使用ones()、zeros() 和 random.random()创建矩阵,只要写入一个描述矩阵维数的元组即可:
numpy还可以处理更高维度的数据:
创建更高维度数据只需要在创建时,在参数中增加一个维度值即可:
根据数组中数值是否满足条件,输出为True或False.
希望得到满足条件的索引,用np.where函数实现.
根据索引得到对应位置的值.
np.where也可以接受另两个可选择的参数a和b。当条件满足时,输出a,反之输出b.
获取数组最大值和最小值的索引可以使用np.argmax和np.argmin.
1、numpy.tofile()和numpy.fromfile()
保存为二进制格式,但是不保存数组形状和数据类型, 即都压缩为一维的数组,需要自己记录数据的形状,读取的时候再reshape.
2、numpy.save() 和 numpy.load()
保存为二进制格式,保存数组形状和数据类型, 不需要进行reshape
实例:
3、numpy.savetxt()和numpy.loadtxt()
np.savetxt(fname,array,fmt=’%.18e’,delimiter=None)
Parameter解释:
array:待存入文件的数组。
fmt:写入文件的格式
实例:
‘柒’ python 如何将三维数组转化为点云三维数组中只有0或者1
使用reshape命令对矩阵进行整形。使用方式reshape(X,m,n...)
改进方式:
a(:,:,1)=[1
2
3;4
5
6;7
8
9];
a(:,:,2)=[0
0
1;0
1
0;1
0
0];
a(:,:,3)=3
for
j=1:3
k=a(j,:,:);
k=reshape(k,3,3);%更改位置,3,3按照自己的矩阵变化,但要保证数目相同
[x,y]=eig(k);%x:特征向量;y:特征值。后期自己再改正哈程序
end
‘捌’ python处理图片数据
目录
1.机器是如何存储图像的?
2.在Python中读取图像数据
3.从图像数据中提取特征的方法#1:灰度像素值特征
4.从图像数据中提取特征的方法#2:通道的平均像素值
5.从图像数据中提取特征的方法#3:提取边缘
是一张数字8的图像,仔细观察就会发现,图像是由小方格组成的。这些小方格被称为像素。
但是要注意,人们是以视觉的形式观察图像的,可以轻松区分边缘和颜色,从而识别图片中的内容。然而机器很难做到这一点,它们以数字的形式存储图像。请看下图:
机器以数字矩阵的形式储存图像,矩阵大小取决于任意给定图像的像素数。
假设图像的尺寸为180 x 200或n x m,这些尺寸基本上是图像中的像素数(高x宽)。
这些数字或像素值表示像素的强度或亮度,较小的数字(接近0)表示黑色,较大的数字(接近255)表示白色。通过分析下面的图像,读者就会弄懂到目前为止所学到的知识。
下图的尺寸为22 x 16,读者可以通过计算像素数来验证:
图片源于机器学习应用课程
刚才讨论的例子是黑白图像,如果是生活中更为普遍的彩色呢?你是否认为彩色图像也以2D矩阵的形式存储?
彩色图像通常由多种颜色组成,几乎所有颜色都可以从三原色(红色,绿色和蓝色)生成。
因此,如果是彩色图像,则要用到三个矩阵(或通道)——红、绿、蓝。每个矩阵值介于0到255之间,表示该像素的颜色强度。观察下图来理解这个概念:
图片源于机器学习应用课程
左边有一幅彩色图像(人类可以看到),而在右边,红绿蓝三个颜色通道对应三个矩阵,叠加三个通道以形成彩色图像。
请注意,由于原始矩阵非常大且可视化难度较高,因此这些不是给定图像的原始像素值。此外,还可以用各种其他的格式来存储图像,RGB是最受欢迎的,所以笔者放到这里。读者可以在此处阅读更多关于其他流行格式的信息。
用Python读取图像数据
下面开始将理论知识付诸实践。启动Python并加载图像以观察矩阵:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from skimage.io import imread, imshow
image = imread('image_8_original.png', as_gray=True)
imshow(image)
#checking image shape
image.shape, image
(28,28)
矩阵有784个值,而且这只是整个矩阵的一小部分。用一个LIVE编码窗口,不用离开本文就可以运行上述所有代码并查看结果。
下面来深入探讨本文背后的核心思想,并探索使用像素值作为特征的各种方法。
方法#1:灰度像素值特征
从图像创建特征最简单的方法就是将原始的像素用作单独的特征。
考虑相同的示例,就是上面那张图(数字‘8’),图像尺寸为28×28。
能猜出这张图片的特征数量吗?答案是与像素数相同!也就是有784个。
那么问题来了,如何安排这784个像素作为特征呢?这样,可以简单地依次追加每个像素值从而生成特征向量。如下图所示:
下面来用Python绘制图像,并为该图像创建这些特征:
image = imread('puppy.jpeg', as_gray=True)
image.shape, imshow(image)
(650,450)
该图像尺寸为650×450,因此特征数量应为297,000。可以使用NumPy中的reshape函数生成,在其中指定图像尺寸:
#pixel features
features = np.reshape(image, (660*450))
features.shape, features
(297000,)
array([0.96470588, 0.96470588, 0.96470588, ..., 0.96862745, 0.96470588,
0.96470588])
这里就得到了特征——长度为297,000的一维数组。很简单吧?在实时编码窗口中尝试使用此方法提取特征。
但结果只有一个通道或灰度图像,对于彩色图像是否也可以这样呢?来看看吧!
方法#2:通道的平均像素值
在读取上一节中的图像时,设置了参数‘as_gray = True’,因此在图像中只有一个通道,可以轻松附加像素值。下面删除参数并再次加载图像:
image = imread('puppy.jpeg')
image.shape
(660, 450, 3)
这次,图像尺寸为(660,450,3),其中3为通道数量。可以像之前一样继续创建特征,此时特征数量将是660*450*3 = 891,000。
或者,可以使用另一种方法:
生成一个新矩阵,这个矩阵具有来自三个通道的像素平均值,而不是分别使用三个通道中的像素值。
下图可以让读者更清楚地了解这一思路:
这样一来,特征数量保持不变,并且还能考虑来自图像全部三个通道的像素值。
image = imread('puppy.jpeg')
feature_matrix = np.zeros((660,450))
feature_matrix.shape
(660, 450)
现有一个尺寸为(660×450×3)的三维矩阵,其中660为高度,450为宽度,3是通道数。为获取平均像素值,要使用for循环:
for i in range(0,iimage.shape[0]):
for j in range(0,image.shape[1]):
feature_matrix[i][j] = ((int(image[i,j,0]) + int(image[i,j,1]) + int(image[i,j,2]))/3)
新矩阵具有相同的高度和宽度,但只有一个通道。现在,可以按照与上一节相同的步骤进行操作。依次附加像素值以获得一维数组:
features = np.reshape(feature_matrix, (660*450))
features.shape
(297000,)
方法#3:提取边缘特征
请思考,在下图中,如何识别其中存在的对象:
识别出图中的对象很容易——狗、汽车、还有猫,那么在区分的时候要考虑哪些特征呢?形状是一个重要因素,其次是颜色,或者大小。如果机器也能像这样识别形状会怎么样?
类似的想法是提取边缘作为特征并将其作为模型的输入。稍微考虑一下,要如何识别图像中的边缘呢?边缘一般都是颜色急剧变化的地方,请看下图:
笔者在这里突出了两个边缘。这两处边缘之所以可以被识别是因为在图中,可以分别看到颜色从白色变为棕色,或者由棕色变为黑色。如你所知,图像以数字的形式表示,因此就要寻找哪些像素值发生了剧烈变化。
假设图像矩阵如下:
图片源于机器学习应用课程
该像素两侧的像素值差异很大,于是可以得出结论,该像素处存在显着的转变,因此其为边缘。现在问题又来了,是否一定要手动执行此步骤?
当然不!有各种可用于突出显示图像边缘的内核,刚才讨论的方法也可以使用Prewitt内核(在x方向上)来实现。以下是Prewitt内核:
获取所选像素周围的值,并将其与所选内核(Prewitt内核)相乘,然后可以添加结果值以获得最终值。由于±1已经分别存在于两列之中,因此添加这些值就相当于获取差异。
还有其他各种内核,下面是四种最常用的内核:
图片源于机器学习应用课程
现在回到笔记本,为同一图像生成边缘特征:
#importing the required libraries
import numpy as np
from skimage.io import imread, imshow
from skimage.filters import prewitt_h,prewitt_v
import matplotlib.pyplot as plt
%matplotlib inline
#reading the image
image = imread('puppy.jpeg',as_gray=True)
#calculating horizontal edges using prewitt kernel
edges_prewitt_horizontal = prewitt_h(image)
#calculating vertical edges using prewitt kernel
edges_prewitt_vertical = prewitt_v(image)
imshow(edges_prewitt_vertical, cmap='gray')
‘玖’ python基础之numpy.reshape详解
这个方法是在不改变数据内容的情况下,改变一个数组的格式,参数及返回值,官网介绍:
a:数组--需要处理的数据
newshape:新的格式--整数或整数数组,如(2,3)表示2行3列,新的形状应该与原来的形状兼容,即行数和列数相乘后等于a中元素的数量
order:
首先做出翻译: order : 可选范围为{‘C’, ‘F’, ‘A’}。使用索引顺序读取a的元素,并按照索引顺序将元素放到变换后的的数组中。如果不进行order参数的设置,默认参数为C。
(1)“C”指的是用类C写的读/索引顺序的元素,最后一个维度变化最快,第一个维度变化最慢。以二维数组为例,简单来讲就是横着读,横着写,优先读/写一行。
(2)“F”是指用FORTRAN类索引顺序读/写元素,最后一个维度变化最慢,第一个维度变化最快。竖着读,竖着写,优先读/写一列。注意,“C”和“F”选项不考虑底层数组的内存布局,只引用索引的顺序。
(3)“A”选项所生成的数组的效果与原数组a的数据存储方式有关,如果数据是按照FORTRAN存储的话,它的生成效果与”F“相同,否则与“C”相同。这里可能听起来有点模糊,下面会给出示例。
二、示例解释
1、首先随机生成一个4行3列的数组
2、使用reshape,这里有两种使用方法,可以使用np.reshape(r,(-1,1),order='F'),也可以使用r1=r.reshape((-1,1),order='F'),这里我选择使用第二种方法。通过示例可以观察不同的order参数效果。
通过例子可以看出来,F是优先对列信息进行操作,而C是优先行信息操作。如果未对r的格式进行设置,那么我们rashape的时候以“A”的顺序进行order的话,它的效果和“C”相同。
3、我们将r的存储方式进行修改,修改为类Fortan的方式进行存储。并做与第2步类似的操作。
基础操作样例:
1.引入numpy,名称为np
2.接下来创建一个数组a,可以看到这是一个一维的数组
3.使用reshape()方法来更改数组的形状,可以看到看数组d成为了一个二维数组
4.通过reshape生成的新数组和原始数组公用一个内存,也就是说,假如更改一个数组的元素,另一个数组也将发生改变
5.同理还可以得到一个三维数组
reshape(-1,1)什么意思:
大意是说,数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。
举例:
同理,只给定行数,newshape等于-1,Numpy也可以自动计算出新数组的列数。
‘拾’ python 中怎么用numpy定义reshape的float数组
这三个数组的主要区别在于维数不同,三个数组分别是一维,二维矩阵和三维矩阵; 比如现在要寻址数组中第二个元素2,分别是: a1[1] a2[0][1] a3[0][0][1]