必须有一种(非常)快速有效的方法来从一个numpy数组中获取元素,或者从一个片段中获得更有趣的元素.假设我有一个numpy数组:
import numpy as np
a = np.arange(-10,10)
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个清单:
s = [9, 12, 13, 14]
Run Code Online (Sandbox Code Playgroud)
我可以选择以下元素:
a[s] #array([-1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)
我怎么能有一个(numpy)数组由[s]中满足条件的元素组成,即是正数(或负数)?应该结果
np.ifcondition(a[s]>0, a[s]) #array([2, 3, 4])
Run Code Online (Sandbox Code Playgroud)
它看起来微不足道,但我无法找到一个简单而浓缩的表达.我确定面具会做,但它看起来并不直接对我来说.但是,都不是:
a[a[s]>0]
a[s[a[s]>0]]
Run Code Online (Sandbox Code Playgroud)
实际上是不错的选择.
我正在寻找一种方法来包含描述散点图中点的大小的(matplotlib)图例,因为这可能与另一个变量有关,就像在这个基本示例中一样:
import numpy as np
import matplotlib.pyplot as plt
N = 50
x = np.random.rand(N)
y = np.random.rand(N)
a2 = 400*np.random.rand(N)
plt.scatter(x, y, s=a2, alpha=0.5)
plt.show()
Run Code Online (Sandbox Code Playgroud)
(灵感来自:http: //matplotlib.org/examples/shapes_and_collections/scatter_demo.html)
所以在传说中a2,根据s描述符,理想情况下很少有与0-400(变量)大小相对应的点scatter.
我注意到write(*,*)Fortran 中列表导向输出的结果依赖于编译器.
确实,用代码:
program one
real(8), dimension(5):: r1
do i=1,5
r1(i)=sqrt(i*10.0)
end do
write(*,*) (r1(i), i =1,5)
end program one
Run Code Online (Sandbox Code Playgroud)
intel编译器ifort给出了换行符打破的标准输出:
3.16227769851685 4.47213602066040 5.47722530364990
6.32455539703369 7.07106781005859
Run Code Online (Sandbox Code Playgroud)
而gfortran给出了等效的一行结果:
3.1622776601683795 4.4721359549995796 5.4772255750516612 6.3245553203367590 7.0710678118654755
Run Code Online (Sandbox Code Playgroud)
我认为ifort每行最多写3个项目(当浮动实数时).有没有办法让ifort输出像gfrotran,即避免换行?理想情况下,我想保留列表导向的输出(*,*)指令,所以我正在寻找类似编译器选项的东西,如果有的话.
在给定的文件记录中,我需要先读取前两个整数元素,然后读取其余的行(大量真实元素),因为赋值取决于前两个.假设前两个的格式整数元素并没有很好地定义.
解决问题的最佳方法可能是:
read(unitfile, "(I0,I0)", advance='no') ii, jj
read(unitfile,*) aa(ii,jj,:)
Run Code Online (Sandbox Code Playgroud)
但在我看来,gfortran中不允许使用"(I0)"规范.
基本上,在unitfile中读取的文件可能是这样的:
0 0 <floats>
0 10 <floats>
10 0 <floats>
100 0 <floats>
100 100 <floats>
Run Code Online (Sandbox Code Playgroud)
很难用任何类似Fortran的固定字段格式规范来阅读.
有没有其他方法来解决这个问题,显然是微不足道的问题?
它似乎对我来说微不足道,但我仍然缺少一种有效和"干净"的方式来插入属于numpy数组(as aa[:,:])的一系列元素在一个格式化的字符串中进行打印/写入.事实上,扩展的逐元素规范语法如下:
formattedline= '%10.6f %10.6f %10.6f' % (aa[ii,0], aa[ii,1], aa[ii,2])
file1.write(formattedline+'\n')
Run Code Online (Sandbox Code Playgroud)
在工作中.
但我还没有找到任何其他更短的解决方案,因为:
formattedline= '%10.6f %10.6f %10.6f' % (float(aa[ii,:]))
file1.write(formattedline+'\n')
Run Code Online (Sandbox Code Playgroud)
当然给出: TypeError: only length-1 arrays can be converted to Python scalars
要么:
formattedline= '%10.6f %10.6f %10.6f' % (aa[ii,:])
file1.write(formattedline+'\n')
Run Code Online (Sandbox Code Playgroud)
给:TypeError: float argument required, not numpy.ndarray.我尝试过迭代器,但没有成功.
当然,当要打印几个元素时,这很有趣.
那么:我怎样才能将迭代结合在numpy数组和字符串格式的时尚上?
我只想创建一个大小(N,m)的numpy数组,它只有第一列由整数组成,其余的默认为float.所以,如果初始化为零,它应该是结果:
array([[ 0, 0., 0., 0., 0.],
[ 0, 0., 0., 0., 0.],
[ 0, 0., 0., 0., 0.],
[ 0, 0., 0., 0., 0.],
[ 0, 0., 0., 0., 0.]])
Run Code Online (Sandbox Code Playgroud)
在尝试创建这样的结构化数组时,我所做的所有尝试都返回了一些元组子元素.
提供一维数组为a:
a=np.arange(8)
Run Code Online (Sandbox Code Playgroud)
我希望它以3D方案再现,以便具有这样的形状(n1, len(a), n3).是否有任何工作方式来获得这个np.tile?这似乎微不足道,但尝试:
np.shape( np.tile(a, (n1,1,n3)) )
Run Code Online (Sandbox Code Playgroud)
要么
np.shape( np.tile( np.tile(a, (n1,1)), (1,1,n2) ) )
Run Code Online (Sandbox Code Playgroud)
我从来没有得到我需要的东西,是由此产生的形状(n1, 1, len(a)*n3)或(1, n1, len(a)*n3).也许是我不理解如何tile工作......
虽然删除 matplotlib 子图/轴似乎很容易,例如delaxes:
fig, ax = plt.subplots(3,1, sharex=True)
for ii in range(3):
ax[ii].plot(arange(10), 2*arange(10))
fig.delaxes(ax[1])
Run Code Online (Sandbox Code Playgroud)
这将始终留下空白在删除的子图/轴的位置
所提出的解决方案似乎都无法解决此问题: Delete a subplot Clearing a subplot in Matplotlib
有没有一种方法可以在显示或保存子图之前基本上挤压子图并删除空白?
我基本上正在寻找将剩余的子图转移到“密集”网格中的最简单方法,以便以前的子图没有空白,可能比重新创建新的(子)图更好。
我有一个二维的numpy数组,例如:
import numpy as np
a1 = np.zeros( (500,2) )
a1[:,0]=np.arange(0,500)
a1[:,1]=np.arange(0.5,1000,2)
# could be also read from txt
Run Code Online (Sandbox Code Playgroud)
那么我想选择与符合条件(例如范围(l1,l2)中包含的所有值a1 [:,1])的切片相对应的索引:
l1=20.0; l2=900.0; #as example
Run Code Online (Sandbox Code Playgroud)
我想用一个简洁的表达来做。但是,两个都没有:
np.where(a1[:,1]>l1 and a1[:,1]<l2)
Run Code Online (Sandbox Code Playgroud)
(它给出ValueError,并建议使用np.all,在这种情况下我不清楚);都不:
np.intersect1d(np.where(a1[:,1]>l1),np.where(a1[:,1]<l2))
Run Code Online (Sandbox Code Playgroud)
正在工作(它给出了不可散列的类型:“ numpy.ndarray”)
然后,我的想法是使用这些索引来映射另一个大小为(500,n)的数组。
有任何合理的方式选择索引吗?或者:在这种情况下是否需要使用口罩?
为了进行字符串匹配,我需要使用前导空格定义bash变量。我需要从整数开始定义它,例如:
jj=5
Run Code Online (Sandbox Code Playgroud)
在我看来,printf是个好主意,因此,如果我想填充最多6个字符的空格:
jpat=`printf " %6i" $jj`
Run Code Online (Sandbox Code Playgroud)
但不幸的是,当我尝试调用该变量时:
echo $jpat
Run Code Online (Sandbox Code Playgroud)
前导空格被删除,我只得到$jj原样的整数。
有什么办法可以保留这样的空间?
(这等效于:v=' val'; echo $v$v。为什么输出中没有开头和多个空格?)
python ×7
numpy ×5
arrays ×4
fortran ×2
io ×2
matplotlib ×2
bash ×1
file-io ×1
formatting ×1
indexing ×1
legend ×1
scatter-plot ×1
string ×1
subplot ×1
substitution ×1
whitespace ×1